Regex для исключения шаблона в имени файла

Мой текущий шаблон:

/\.(scss|js|jsx)$/  

Я хочу исключить файлы, которые заканчиваются на "-test.js"

Я пробовал:

/(?!-test)\.(scss|js|jsx)$/

но это не работает

3 ответа

Поскольку JS не поддерживает lookbehind, вы можете сделать ^(?!.*-test\.js$).*\.(js|scss|jsx)$ как обходной путь.

Regex Demo

var testFiles = ['p-test.js',
  'q-test.scss',
  'r-test.jsx',
  'p.js',
  'q.scss',
  'r.jsx',
  'sadadf-testddd.js'
];
var myRegexp = /^(?!.*-test\.js$).*\.(js|scss|jsx)$/g;
testFiles.forEach(function(file) {
  var match = file.match(myRegexp)
  console.log(file + " : " + (match ? 'matches' : 'does not match'));
})

js|jsx можно улучшить / ускорить с помощью: jsx?,
scss можно ускорить с помощью scs{2},
Помещение более коротких "альтернатив" перед более длинными улучшит скорость. (jsx?|scs{2})

Шаблоны:

/^(.(?!-test\.js$))+\.(jsx?|scs{2})$/

или почти на половине шагов, из-за удаленной группы захвата:

/^(?!.*-test\.js$).*\.(jsx?|scs{2})$/

демонстрация

Тестовые случаи:

a-test.js      #fail
b-test.scss    #pass 
c-test.jsx     #pass
d.js           #pass
e.scss         #pass
f.jsx          #pass
g-testg.js     #pass
h-testh.scss   #pass
i-testi.jsx    #pass

Попробуй это:

/^([a-z0-9-_](?!-test\.))+\.(scss|js|jsx)$/

Ни один из символов имени файла не должен сопровождаться -test.,

Другие вопросы по тегам