Javascript:负面lookbehind等效?

有没有一种方法可以在javascript正则表达式中实现相当于负向后置的效果? 我需要匹配不以特定字符集开头的字符串。

看来我无法找到一个正则表达式,如果在字符串的开头找到匹配的部分,就不会失败。 消极后验似乎是唯一的答案,但JavaScript没有。

编辑:这是我想工作的正则表达式,但它不:

(?<!([abcdefg]))m

所以它会匹配'jim'或'm'中的'm',而不是'jam'


Lookbehind Assertions在2018年被接受进入ECMAScript规范。这已在V8中实现,并且在没有标志的情况下在没有标志的情况下在没有旗标的情况下在谷歌浏览器v62和在Node.js v6中运行。 因此,如果您正在开发仅支持Chrome浏览器的环境(如Electron)或Node,则可以立即开始使用向后看!

积极的lookbehind用法:

console.log(
  "$9.99  €8.47".match(/(?<=$)d+(.d*)?/) // Matches "9.99"
);

由于Javascript支持负向预测,因此一种安全的方法是:

假设你想要这样做

(?<!([abcdefg]))m
  • 反转字符串以匹配
  • 使用向前的方式应用你的模式“倒退”(注意前视中的反向匹配表达式,在这种情况下,它保持不变)

    m(?!([abcdefg]))
    
  • 反转所有匹配的令牌

  • 例子:

    我定义了以下功能:

    const reverse = s => s.split('').reverse().join('');
    
    const test = (stringToTests, reversedRegexp) => stringToTests
      .map(reverse)
      .forEach((s,i) => {
        const match = reversedRegexp.test(s);
        console.log(
          stringToTests[i], 
          match, 
          'token:', 
          match ? reverse(reversedRegexp.exec(s)[0]) : 'Ø'
        );
      });
    

    例1:

    继安德鲁 - 艾斯利的问题之后:

    test(['jim', 'm', 'jam'], /m(?!([abcdefg]))/)
    

    输出:

    jim true token: m
    m true token: m
    jam false token: Ø
    

    例2:

    在@neaumusic评论之后(匹配max-height但不是line-height ,令牌为height ):

    test(['max-height', 'line-height'], /thgieh(?!(-enil))/)
    

    输出:

    max-height true token: height
    line-height false token: Ø
    

    Mijoja的策略适用于您的特定情况,但不是一般情况:

    js>newString = "Fall ball bill balll llama".replace(/(ba)?ll/g,
       function($0,$1){ return $1?$0:"[match]";});
    Fa[match] ball bi[match] balll [match]ama
    

    下面是一个例子,其目标是匹配double-l,但如果前面是“ba”,则不会。 请注意“balll”这个词 - 真正的lookbehind应该压制前两个,但匹配第二个。 但是通过匹配前两个匹配项,然后忽略该匹配项作为误报,正则表达式引擎从该匹配项的末尾开始,忽略误报内的任何字符。

    链接地址: http://www.djcxy.com/p/74827.html

    上一篇: Javascript: negative lookbehind equivalent?

    下一篇: Making letters uppercase using re.sub in python?