下面是一个在大多数regex实现中都工作得很好的regex:
(?<!filename)\.js$对于除filename.js之外的以.js结尾的字符串,这将与.js匹配
Javascript没有正则表达式后视功能。有没有人能把一个替代的正则表达式放在一起,用javascript实现同样的结果?
这里有一些想法,但需要帮助器函数。我希望通过一个正则表达式来实现它:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
发布于 2011-09-11 14:07:29
编辑:从ECMAScript 2018开始,lookbehind assertions (even unbounded) are supported natively。
在以前的版本中,您可以执行以下操作:
^(?:(?!filename\.js$).)*\.js$这会显式地执行后视表达式隐式执行的操作:如果后视表达式加上后面的正则表达式不匹配,则检查字符串的每个字符,然后才允许该字符匹配。
^ # 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发布于 2014-11-30 21:50:01
假设您想查找前面没有unsigned的所有int
支持负向回溯:
(?<!unsigned )int如果不支持负向回溯:
((?!unsigned ).{9}|^.{0,8})int基本的想法是抓住n个前面的字符,并排除具有负先行匹配的匹配,但也匹配没有前面n个字符的情况。(其中n是后视的长度)。
所以有问题的正则表达式:
(?<!filename)\.js$将转化为:
((?!filename).{8}|^.{0,7})\.js$您可能需要使用捕获组来找到您感兴趣的字符串的确切位置,或者您不想用其他东西替换特定部分。
发布于 2015-11-27 02:08:25
如果您可以向前看,但可以向后看,您可以先反转字符串,然后进行向前看。当然,还需要做更多的工作。
https://stackoverflow.com/questions/7376238
复制相似问题