什么是一个很好的正则表达式匹配任何以`.js`结尾的文件名,但不是' .bin.js'

时间:2016-06-17 23:18:39

标签: 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$ https://regex101.com/r/iR6yC9/1。这种方法的问题是.+以及.js$被拼写两次,所以感觉有点冗长和多余。

  • ^(?:(?!\.bin\.js$).)+\.js$ https://regex101.com/r/zQ1kE0/1。第二种方法的问题在于,非捕获组内部的前瞻性使得它的可读性较差,尽管它可以重复使用' .+

我觉得这两种解决方案都不理想。我想知道是否有一个很好的正则表达式来解决这个更易读,更少冗余的问题

2 个答案:

答案 0 :(得分:2)

如果Javascript具有负面的外观,那就是这样做的方法。由于它没有,最易读的解决方案(恕我直言)是使用两个正则表达式。

if (/\.js$/.test(filename) && !/\.bin\.js$/.test(filename))

如果你能用另一种具有负面看法的语言来做,那就是:

/(?<!\.bin)\.js$/

如果您阅读javascript regex - look behind alternative?,您会发现原始表达式是此缺失功能的常用解决方法之一。

答案 1 :(得分:0)

这种正则表达式起初是违反直觉的,直到你不得不与类似的几次争吵,然后它才有意义,但需要一些摆弄。

无论如何,这应该可以解决问题。

/.*(?:[^n]|[^i]n|[^b]in|[^.]bin)\.js$/

尝试on rgex101.com