这是一个在大多数正则表达式实现中都能正常运行的正则表达式:
(?<!filename)\.js$
这匹配.js为一个以.js结尾的字符串,除了filename.js
Javascript没有正则表达式。有没有人能够组合一个替代正则表达式,它可以实现相同的结果,并且可以在javascript中运行?
以下是一些想法,但需要辅助功能。我希望用正则表达式实现它: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
答案 0 :(得分:142)
编辑:从2018年ECMAScript开始,lookbehind assertions (even unbounded) are supported natively。
在以前的版本中,您可以这样做:
^(?:(?!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
答案 1 :(得分:60)
^(?!filename).+\.js
适合我
测试:
可以在Regular expression to match string not containing a word?
找到此正则表达式的正确解释从version 1.5 of javascript开始向前看,并且所有主流浏览器都支持
更新以匹配filename2.js和2filename.js但不匹配filename.js
(^(?!filename\.js$).).+\.js
答案 2 :(得分:22)
假设您要查找int
之前没有的所有unsigned
:
支持负面观察:
(?<!unsigned )int
不支持负面观察:
((?!unsigned ).{9}|^.{0,8})int
基本上,想法是抓住前面的n个字符并排除与负前瞻的匹配,但也匹配前面没有n个字符的情况。 (其中n是后视的长度)。
所以有问题的正则表达式:
(?<!filename)\.js$
会转换为:
((?!filename).{8}|^.{0,7})\.js$
您可能需要使用捕获组来查找您感兴趣的字符串的确切位置,或者您不想用其他内容替换特定部分。
答案 3 :(得分:5)
如果你可以向前看但是回来,你可以先扭转字符串然后再做一个预测。当然,还需要做更多的工作。
答案 4 :(得分:0)
这是Tim Pietzcker's answer的等效解决方案(另见相同答案的评论):
^(?!.*filename\.js$).*\.js$
表示匹配除*.js
以外的*filename.js
。
要获得此解决方案,您可以检查负面外观排除哪些模式,然后使用否定前瞻精确排除这些模式。
答案 5 :(得分:-1)
以下是一个积极的后视JavaScript替代方案,展示了如何捕获以'Michael'作为名字的人的姓氏。
1)鉴于此文:
const exampleText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";
获取一系列名为Michael的姓氏。
结果应为:["Jordan","Johnson","Green","Wood"]
2)解决方案:
function getMichaelLastName2(text) {
return text
.match(/(?:Michael )([A-Z][a-z]+)/g)
.map(person => person.slice(person.indexOf(' ')+1));
}
// or even
.map(person => person.slice(8)); // since we know the length of "Michael "
3)检查解决方案
console.log(JSON.stringify( getMichaelLastName(exampleText) ));
// ["Jordan","Johnson","Green","Wood"]
在这里演示:http://codepen.io/PiotrBerebecki/pen/GjwRoo
您也可以通过运行下面的代码段来试用它。
const inputText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";
function getMichaelLastName(text) {
return text
.match(/(?:Michael )([A-Z][a-z]+)/g)
.map(person => person.slice(8));
}
console.log(JSON.stringify( getMichaelLastName(inputText) ));