正则表达式中的文件名排除图案

问题描述:

我现在的模式是:正则表达式中的文件名排除图案

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

我希望排除与结尾的文件“-test.js”

我已经试过:

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

但它不工作。

+0

什么语言/环境将您可以在运行这种模式?你能提供几个样本输入和你的预期结果吗?请发布您的语言特定的正则表达式实现。 – mickmackusa

+0

javascript,文件名blabla.js应该匹配,blabla-test.js不应该匹配。所有与.scss和.jsx应匹配。用于webpack config – jeff

试试这个:

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

文件名中的字符都不应遵循-test.

+0

我刚修复它。 – Adam

js|jsx可以通过使用jsx?来完善/加速。
scss可以通过使用scs{2}加速。
把较短的“替代品”放在较长的“替代品”之前会提高速度。 (jsx?|scs{2})

模式:

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

或近一半的步骤,由于去除捕获组:

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

Demo

测试用例:

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 

由于JS不支持逆向查看,因此可以使用^(?!.*-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')); 
 
})

+0

thx这是有效的,但并不完美:确切的反模式应该是“* -test.js”,所以在“test”和“.js”之间没有空格其他字符,减号是模式的一部分https:// regex101 .com/r/upQVte/4 – jeff

+0

@jeff对不起。以防万一,更新我的答案。 – Piyush

+0

谢谢,“sadadf-testddd.js”仍然是一个错误的负面 – jeff