使用JavaScript排除正则表达式上一行开头或结尾的匹配项

时间:2019-03-15 14:08:58

标签: javascript regex regex-negation

我正在尝试在JavaScript中定义一个与所有匹配项匹配的正则表达式,但不包括一行开头或结尾的匹配项。

我可以排除开头的内容,但不能排除结尾的内容。 例如:

const MULTILINE = `
Lorem ipsum dolor sit amet ANNA
ANNA lorem ipsum dolor sit amet
Lorem ipsum dolor ANNA sit amet
`

MULTILINE.match(/ANNA\w+/gm)
// output: ["ANNA_END", "ANNA_BEGIN", "ANNA_MIDDLE"] ok

MULTILINE.match(/(?!^)ANNA\w+/gm))
// output: ["ANNA_END", "ANNA_MIDDLE"] ok

MULTILINE.match(/ANNA\w+(?!$)/gm))
// output: ["ANNA_EN", "ANNA_BEGIN", "ANNA_MIDDLE"] fail
// expected: ["ANNA_BEGIN", "ANNA_MIDDLE"]

如图所示,它可以正确识别我的最后一个字符串,但是提取出最后一个字符(就像$被另一个\ d表达式替换一样)。

我阅读了许多文档,尝试了MULTILINE.match(/ANNA\w+(?!ANNA\w+$)/gm))之类的几种变体,但没有成功。

这里有帮助吗? :)

1 个答案:

答案 0 :(得分:1)

ANN_END返回ANN_EN匹配项是因为(?!$)在失败时会提前进行引擎回溯,并且作为(?!$)之前的模式是\w+,在+量化模式下,回溯使匹配可以在字符串结尾之前完成。请参阅this demo,并注意在步骤9中显示回溯的红色箭头:

enter image description here

要禁止部分单词匹配,可以添加单词边界\b或另一个前行(?!\w)

匹配ANNA\w+而不是在字符串开头/结尾的完整解决方案看起来像

/(?!^)\bANNA\w+\b(?!$)/gm

请参见regex demo

详细信息

  • (?!^)-如果正则表达式索引位于字符串的开头,则负匹配将使匹配失败
  • \b-单词边界
  • ANNA-子字符串
  • \w+-一个或多个单词字符
  • \b-单词边界
  • (?!$)-如果正则表达式索引位于字符串的末尾,则负匹配将使匹配失败。

JS演示:

const MULTILINE = `Lorem ipsum dolor sit amet ANNA_END
ANNA_BEGIN lorem ipsum dolor sit amet
Lorem ipsum dolor ANNA_MIDDLE sit amet`;
console.log(MULTILINE.match(/(?!^)\bANNA\w+\b(?!$)/gm));