javascript正则表达式 - 看看替代方案?

dan*_*iel 133 javascript regex

这是一个在大多数正则表达式实现中都能正常工作的正则表达式:

(?<!filename)\.js$
Run Code Online (Sandbox Code Playgroud)

这匹配.js为一个以.js结尾的字符串,除了filename.js

Javascript没有正则表达式.是否有人能够组合一个替代正则表达式,实现相同的结果,并在JavaScript中工作?

这里有一些想法,但需要辅助功能.我希望用正则表达式实现它:http: //blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

Tim*_*ker 145

编辑:从ECMAScript 2018开始,本机支持lookbehind断言(甚至无限制).

在以前的版本中,您可以这样做:

^(?:(?!filename\.js$).)*\.js$
Run Code Online (Sandbox Code Playgroud)

这明确地显示了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
Run Code Online (Sandbox Code Playgroud)

另一个编辑:

我很难说(特别是因为这个答案得到了很多支持),有一种更容易实现这一目标的方法.没有必要检查每个角色的前瞻:

^(?!.*filename\.js$).*\.js$
Run Code Online (Sandbox Code Playgroud)

同样有效:

^                 # 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
Run Code Online (Sandbox Code Playgroud)

  • @daniel:嗯,你的正则表达式(带有lookbehind)也与`2filename.js`不匹配.我的正则表达式匹配与示例正则表达式完全相同的情况. (9认同)

Ben*_*ate 60

^(?!filename).+\.js 适合我

测试:

  • test.js匹配
  • blabla.js匹配
  • filename.js不匹配

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

1.5版本的javascript开始可以使用,所有主流浏览器都支持

更新以匹配filename2.js和2filename.js但不匹配filename.js

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

  • @daniel你问了一个后视,而不是一个预见,为什么你接受了这个答案? (9认同)
  • 您链接的问题涉及一个稍微不同的问题:匹配一个不包含目标词**的字符串*.这个更简单:匹配一个不以*开头的字符串*目标字. (5认同)

Kam*_*zot 25

我们假设你想找到所有int没有前面的unsigned:

支持负面观察:

(?<!unsigned )int
Run Code Online (Sandbox Code Playgroud)

不支持负面观察:

((?!unsigned ).{9}|^.{0,8})int
Run Code Online (Sandbox Code Playgroud)

基本上,想法是抓住前面的n个字符并排除与负前瞻的匹配,但也匹配没有前n个字符的情况.(其中n是后视的长度).

所以有问题的正则表达式:

(?<!filename)\.js$
Run Code Online (Sandbox Code Playgroud)

会转化为:

((?!filename).{8}|^.{0,7})\.js$
Run Code Online (Sandbox Code Playgroud)

您可能需要使用捕获组来查找您感兴趣的字符串的确切位置,或者您不希望用其他内容替换特定部分.

  • 感谢您提供更通用的答案,该答案即使在文本中需要深度匹配的地方也可以使用(在此处最初的^不切实际)! (2认同)

小智 5

如果你可以向前看但是回来,你可以先扭转字符串然后再做一个预测.当然,还需要做更多的工作.

  • 这个答案真的可以用一些改进.这似乎更像是对我的评论. (5认同)