Javascript 什么样的正则表达式可以匹配以“.js”结尾但不以';结尾的任何文件名;。bin.js';
例如,我希望匹配以下内容:Javascript 什么样的正则表达式可以匹配以“.js”结尾但不以';结尾的任何文件名;。bin.js';,javascript,regex,Javascript,Regex,例如,我希望匹配以下内容: file1.js file2.src.js file3.bin.src.js file1.binbin.js file1.in.js file1.b.js 但不是: file1.bin.js file2.src.bin.js 到目前为止,我有以下解决方案: ^(?。+\.bin\.js$).+\.js$。这种方法的问题是+以及。js$被拼写了两次,因此感觉有点冗长和多余 ^(?(?!\.bin\.js$)+\.js$。第二种方法的问题是,非捕获组中的前瞻性使
- file1.js
- file2.src.js
- file3.bin.src.js
- file1.binbin.js
- file1.in.js
- file1.b.js
- file1.bin.js
- file2.src.bin.js
。这种方法的问题是^(?。+\.bin\.js$).+\.js$
以及+
被拼写了两次,因此感觉有点冗长和多余。js$
。第二种方法的问题是,非捕获组中的前瞻性使其可读性降低,尽管它确实“重用”了^(?(?!\.bin\.js$)+\.js$
+
我觉得这两种解决方案都不理想。我想知道是否有一个好的正则表达式来解决这个问题,它更具可读性,冗余更少如果Javascript具有负lookbehind,这就是解决这个问题的方法。因为没有,所以最具可读性的解决方案(IMHO)是使用两个正则表达式
if (/\.js$/.test(filename) && !/\.bin\.js$/.test(filename))
如果你能用另一种有负面影响的语言来做,那就是:
/(?<!\.bin)\.js$/
/(?
如果您阅读,您会发现您的原始表达式是解决此缺失功能的常见方法之一。这种正则表达式起初是违反直觉的,直到您不得不多次争论类似的正则表达式,然后它才有意义,但需要一些修改
不管怎么说,这应该能奏效
/.*(?:[^n]|[^i]n|[^b]in|[^.]bin)\.js$/
试试看你需要使用反向查找,但Javascript没有。我认为你的“问题”是重复使用“.js”等部分这不是问题。它更容易阅读,可能比其他表达式更快。谢谢。不幸的是,两个正则表达式对我来说不是一个选项。如果我不使用JavaScript,那么使用反向查找有什么好的解决方案呢?@LiangZhou为什么不是一个选项?你没告诉我们什么?@DaveNewton,因为我没有代码,所以我不能t更改逻辑。regex是可配置的,因此我可以更改。该逻辑当前正在使用可配置的regex,并根据文件名进行测试。因此它必须是一个regex解决方案。这应该实现“更可读,更少冗余”的技巧?^^小问题:它匹配bla.js\n.js
-除此之外,它可能是最好的…不,它只是看起来多余。文件名中有文字换行符?或者字符串带有文字反斜杠,后跟n
?要排除名为just.js
-跨换行符匹配是一种怪癖f使用rgex101.com,因为它似乎缺少一种模式,即每一行都是独立的字符串,而不仅仅是大型多行字符串的一部分。如果在大型多行字符串中不匹配,则不必担心这一点。如果在多行文本中匹配,则会变得更加棘手,这应该是您的问题的一部分,因为这是一个重要的复杂问题。bla.js\n.js.match(/。+(?:[^n]|[^i]n |[^b]in |[^.]bin)\.js$/gm)
返回[“bla.js\n.js”
-它匹配两行。bla.js\n.js.js.js.match(/。/(?:[^n]|[^i]n.[^b]in.[^js]
也匹配'bla.js\n.js'
-没有任何标志。我假设OP不想处理这样的文件名,因为他的引用正则表达式与它们不匹配。