javascript regex - 看看替代方案的背后?

2022-08-30 02:35:47

下面是一个在大多数正则表达式实现中运行良好的正则表达式:

(?<!filename)\.js$

这与以除文件名外的.js结尾的字符串.js匹配.js

Javascript 没有正则表达式 lookbehind。有没有人能够将另一个正则表达式放在一起,以实现相同的结果并在javascript中工作?

这里有一些想法,但需要帮助程序函数。我希望通过正则表达式实现它:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript


答案 1

编辑:从 ECMAScript 2018 开始,本机支持 lookbehind 断言(甚至是无界的)。

在以前的版本中,您可以执行以下操作:

^(?:(?!filename\.js$).)*\.js$

这明确地执行了 lookbehind 表达式隐式执行的操作:检查字符串的每个字符,如果 lookbehind 表达式加上它后面的正则表达式不匹配,则只允许该字符匹配。

^                 # Start of string
(?:               # Try to match the following:
 (?!              # First assert that we can't match the following:
  filename\.js    # filename.js 
  $               # and end-of-string
 )                # End of negative lookahead
 .                # Match any character
)*                # Repeat as needed
\.js              # Match .js
$                 # End of string

另一个编辑:

我很痛苦地说(特别是因为这个答案已经被投票了这么多),有一种更容易的方法来实现这个目标。没有必要检查每个字符的展望:

^(?!.*filename\.js$).*\.js$

同样有效:

^                 # Start of string
(?!               # Assert that we can't match the following:
 .*               # any string, 
  filename\.js    # followed by filename.js
  $               # and end-of-string
)                 # End of negative lookahead
.*                # Match any string
\.js              # Match .js
$                 # End of string

答案 2

^(?!filename).+\.js为我工作

测试针对:

  • 测试.js匹配
  • 布拉布拉.js比赛
  • 文件名.js不匹配

可以在正则表达式中找到此正则表达式的正确解释,以匹配不包含单词的字符串?

Look Ahead自JavaScript的1.5版本起可用,并且受所有主流浏览器的支持

更新以匹配文件名2.js和2文件名.js但不匹配文件名.js

(^(?!filename\.js$).).+\.js