正则表达式:是否有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