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不想处理这样的文件名,因为他的引用正则表达式与它们不匹配。