首页 > 解决方案 > 什么正则表达式 (PCRE) 会找到两个不包含特定单词的特定单词?

问题描述

我需要帮助提出一个 PCRE 正则表达式,该表达式将在多行文件中找到两个出现的单词,而它们之间没有某个单词。

下面的第一个例子应该匹配,因为“foo”出现了两次,它们之间没有单词“bar”,而第二个例子不应该匹配,因为“foo”出现了两次,它们之间有单词“bar”。

匹配示例:

foo
跳过
了 懒惰
foo


不匹配示例:

foo
跳过酒吧foo
_
_


标签: regexpcre

解决方案


您的问题可能以前曾被问过,尽管可能不完全相同。这里的一种方法是在 的出现之间进行匹配时使用回火点foo,以确保我们不会bar一路交叉。尝试在启用 dot all 模式的情况下运行以下正则表达式:

\bfoo\b((?!\bbar\b).)*?\bfoo\b

演示

以下是使用的正则表达式模式的解释:

\bfoo\b           match an initial "foo"
((?!\bbar\b).)*?  match any content, including across newlines, provided
                  that we do not pass "bar" along the way
\bfoo\b           match a final "foo"

如果您没有可用的 dot all 模式,您可以使用类似的模式对其进行模拟:

\bfoo\b((?!\bbar\b)[\s\S])*?\bfoo\b

推荐阅读