显然,您可以使用|(管道?)来表示OR,但是是否也有一种方法来表示AND呢?
具体来说,我希望匹配包含某个短语的所有文本段落,但没有特定的顺序。
显然,您可以使用|(管道?)来表示OR,但是是否也有一种方法来表示AND呢?
具体来说,我希望匹配包含某个短语的所有文本段落,但没有特定的顺序。
当前回答
为什么不用awk呢? 用awk regex AND, OR的问题是如此简单
awk '/WORD1/ && /WORD2/ && /WORD3/' myfile
其他回答
在正则表达式之外使用AND。在PHP中,提前操作符似乎不适合我,相反,我使用了这个
if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
return true;
else
return false;
如果密码长度为3个字符或更多,并且密码中没有空格,则上述正则表达式将匹配。
如果你使用Perl正则表达式,你可以使用正向预测:
例如
(?=[1-9][0-9]{2})[0-9]*[05]\b
是否有大于100且能被5整除的数
您需要像其他应答者所说的那样使用预读,但是预读必须考虑目标单词和当前匹配位置之间的其他字符。例如:
(?=.*word1)(?=.*word2)(?=.*word3)
第一个前向中的.*让它在到达"word1"之前匹配任意数量的字符。然后匹配位置被重置,第二个前向查找“word2”。再次重置,最后部分匹配“word3”;因为它是你要检查的最后一个单词,所以它没有必要出现在前瞻中,但这也无妨。
为了匹配整个段落,您需要在两端锚定正则表达式,并添加一个最后的.*来消耗剩余的字符。使用perl风格的符号,这将是:
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
'm'修饰符用于多行模式;它允许^和$匹配段落边界(regex术语为“行边界”)。在这种情况下,重要的是不要使用's'修饰符,它允许点元字符匹配换行符以及所有其他字符。
最后,你要确保你匹配的是整个单词,而不是长单词的片段,所以你需要添加单词边界:
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m
下面是and运算符的可能“形式”:
以下面的正则表达式为例:
如果我们想匹配没有“e”字符的单词,我们可以这样做:
/\b[^\We]+\b/g
\W表示不是“单词”字符。 ^\W表示“字”字符。 [^\We]表示“单词”字符,而不是“e”。
看一下实际情况:没有e的单词
和“正则表达式的运算符”
我认为这个模式可以用作正则表达式的“和”操作符。
一般而言,如果:
A = not A B =非B
然后:
[^AB] = not(A or B)
= not(A) and not(B)
= a and b
差集
所以,如果我们想在正则表达式中实现差分集的概念,我们可以这样做:
a - b = a and not(b)
= a and B
= [^Ab]
你可以用正则表达式来做,但你可能会想用其他的表达式。例如,使用几个regexp并将它们组合在一个if子句中。
你可以用一个标准的regexp枚举所有可能的排列,像这样(以任意顺序匹配a, b和c):
(abc)|(bca)|(acb)|(bac)|(cab)|(cba)
但是,如果有多个项,这会使regexp变得非常长,而且可能效率很低。
如果您使用的是一些扩展的regexp版本,比如Perl或Java的,它们有更好的方法来实现这一点。其他答案建议使用正前向运算。