使用 JavaScript 排除正则表达式中一行开头或结尾的匹配项
Excluding matches on the beginning or end of a line on a Regex with JavaScript
我正在尝试在 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
returns ANN_EN
匹配,因为 (?!$)
前瞻在失败时使引擎回溯,并且 (?!$)
之前的模式是\w+
,一个+
量化模式,回溯使得匹配在字符串结束之前完成。参见this demo 并注意第 9 步中显示回溯的红色箭头:
要禁止这种部分单词匹配,您可以添加单词边界 \b
或另一个前瞻性 (?!\w)
。
不在字符串 start/end 处匹配 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 中定义一个匹配所有出现的正则表达式,不包括行首或行尾的出现。
我可以排除开头的,但不能排除结尾的。 例如:
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
returns ANN_EN
匹配,因为 (?!$)
前瞻在失败时使引擎回溯,并且 (?!$)
之前的模式是\w+
,一个+
量化模式,回溯使得匹配在字符串结束之前完成。参见this demo 并注意第 9 步中显示回溯的红色箭头:
要禁止这种部分单词匹配,您可以添加单词边界 \b
或另一个前瞻性 (?!\w)
。
不在字符串 start/end 处匹配 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));