javascript - 使用 JavaScript 排除正则表达式行首或行尾的匹配项

标签 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)) 但没有成功。

这里有什么帮助吗? :)

最佳答案

ANN_END 返回 ANN_EN 匹配,因为 (?!$) 前瞻失败时,使引擎回溯,并且作为正确的模式before (?!$) is \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));

关于javascript - 使用 JavaScript 排除正则表达式行首或行尾的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55184476/

相关文章:

javascript - 图像预览在 Safari 中不起作用

php - 未终止的字符串文字,在 Javascript 中使用 PHP

java - 在java中从字符串中获取部分内容的最佳方法

regex - BigQuery Regexp 中的前瞻

java - 需要编写一个 java 正则表达式,该表达式与 http 或 https 的 url 匹配,但不包含特定的文件扩展名

javascript - 正则表达式匹配 "everything but"与 webpack 的 kebab-case

javascript - css 在特定页面上不显示,没有页面 id

javascript - jQuery/Javascript - 多重正则表达式验证

javascript - 如何从 CSS 文本中解析属性/值对

Java正则表达式替换除少数字符组合之外的所有字符