协慌网

登录 贡献 社区

正则表达式:是否有 AND 运算符?

显然,您可以使用| (管道?)代表OR ,但是还有一种方法代表AND吗?

具体来说,我想匹配包含某个短语的全部但没有特定顺序的文本段落。

答案

使用非消耗性的正则表达式。

典型的(即 Perl / Java)表示法是:

(?= expr )

这表示 “ match expr,但此后继续在原始匹配点进行匹配”。

您可以根据需要执行任意多个操作,这将是一个 “与”。例子:

(?=match this expression)(?=match this too)(?=oh, and this)

如果需要在其中使用一些数据,甚至可以在非使用表达式中添加捕获组。

您需要像其他一些响应者所说的那样使用前行,但是前行必须考虑其目标词和当前匹配位置之间的其他字符。例如:

(?=.*word1)(?=.*word2)(?=.*word3)

前瞻中的.*使其可以匹配到达 “word1” 之前需要的许多字符。然后,将匹配位置重置,第二个超前查找出 “word2”。再次重置,最后部分匹配 “word3”;由于这是您要检查的最后一个词,因此不必提前,但不会造成伤害。

为了匹配整个段落,您需要在两端固定正则表达式,并添加最终的.*以使用其余字符。使用 Perl 样式的表示法,将是:

/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m

'm' 修饰符用于多行模式;它使^$在段落边界(正则表达式中的 “行边界”)匹配。在这种情况下,请务必不要使用's' 修饰符,该修饰符可使点元字符与换行符以及所有其他字符匹配。

最后,您要确保匹配整个单词,而不仅仅是长单词的片段,因此您需要添加单词边界:

/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m

看这个例子:

我们有 2 个正则表达式 A 和 B,我们想将它们都匹配,因此在伪代码中,它看起来像这样:

pattern = "/A AND B/"

无需使用 AND 运算符就可以编写它,如下所示:

pattern = "/NOT (NOT A OR NOT B)/"

在 PCRE 中:

"/(^(^A|^B))/"

regexp_match(pattern,data)