JavaScript的正则expression式 – 看看后面的替代?
这是一个在大多数正则expression式中工作正常的正则expression式:
(?<!filename)\.js$
这与匹配.js的string以.js结尾,除了filename.js
Javascript没有正则expression式。 任何人都可以把一个替代正则expression式实现相同的结果,并在JavaScript中工作?
这里有一些想法,但需要帮手function。 我只是希望用正则expression式来实现它: http : //blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
^(?!filename).+\.js
适合我
testing对:
- test.js匹配
- blabla.js比赛
- filename.js不匹配
这个正则expression式的正确解释可以在正则expression式中find匹配不包含单词的string?
预览从JavaScript的1.5版本开始可用,并且受到所有主stream浏览器的支持
更新以匹配filename2.js和2filename.js,但不是filename.js
(^(?!filename\.js$).).+\.js
你可以这样做:
^(?:(?!filename\.js$).)*\.js$
这明确地说明了后视expression式隐含地做了什么:如果后向expression式加上后面的正则expression式不匹配,则只检查string的每个字符,然后才允许该字符匹配。
^ # 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
假设你想要find所有的int
而不是前面的unsigned
:
支持消极的后顾之忧:
(?<!unsigned )int
没有支持消极的后顾之忧:
((?!unsigned ).{9}|^.{0,8})int
基本的想法是抓取n个前面的字符,排除负向前瞻的匹配,但也匹配没有前n个字符的情况。 (其中n是后顾长度)。
所以正确的正则expression式:
(?<!filename)\.js$
将转化为:
((?!filename).{8}|^.{0,7})\.js$
您可能需要使用捕获组来查找感兴趣的string的确切位置,或者您不想用其他方法replace特定的部分。
如果你可以向前看但是回来,你可以先扭转string,然后做一个前瞻。 当然,还需要做更多的工作。
下面是一个积极的lookbehind JavaScript替代scheme,展示了如何捕获以“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?";
得到一系列名为迈克尔的姓氏。 结果应该是: ["Jordan","Johnson","Green","Wood"]
2)解决scheme:
function getMichaelLastName2(text) { return text .match(/(?:Michael )([AZ][az]+)/g) .map(person => person.slice(person.indexOf(' ')+1)); } // or even .map(person => person.slice(8)); // since we know the length of "Michael "
3)检查解决scheme
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 )([AZ][az]+)/g) .map(person => person.slice(8)); } console.log(JSON.stringify( getMichaelLastName(inputText) ));
这是Tim Pietzcker的答案的同等解决scheme(另请参阅同一答案的评论):
^(?!.*filename\.js$).*\.js$
这意味着,匹配*.js
除了*filename.js
。
为了得到这个解决scheme,你可以检查负面lookbehind排除哪些模式,然后排除这些模式与负面的前瞻。