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排除哪些模式,然后排除这些模式与负面的前瞻。