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

显然,你可以使用| (pipe?)来表示OR ,但是有没有办法来表示AND

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


使用非消费正则表达式。

典型的(即Perl / Java)符号是:

(?= expr )

这意味着“匹配expr,但之后继续匹配原始匹配点”。

你可以尽可能多的做你想做的,这将是一个“和”。 例:

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

如果您需要在其中保存一些数据,您甚至可以在非消费表达式内添加捕获组。


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

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

在第一个预览中的.*可以让它匹配它需要的许多字符,然后到达“word1”。 然后匹配位置被重置,第二个预测寻找“word2”。 重新复位,最后一部分匹配“word3”; 因为这是你要检查的最后一个词,它没有必要在前瞻中,但它不会受到伤害。

为了匹配整个段落,您需要在两端都定位正则表达式,并添加最终的.*来消耗剩余的字符。 使用Perl风格的符号,那将是:

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

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

最后,你要确保你匹配整个单词而不仅仅是更长的单词的片段,所以你需要添加单词边界:

/^(?=.*bword1b)(?=.*bword2b)(?=.*bword3b).*$/m

看看这个例子:

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

pattern = "/A AND B/"

它可以不使用AND运算符来编写,如下所示:

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

在PCRE中:

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

regexp_match(pattern,data)
链接地址: http://www.djcxy.com/p/13439.html

上一篇: Regular Expressions: Is there an AND operator?

下一篇: Regular Expression for alphanumeric and underscores