显然,您可以使用|(管道?)来表示OR,但是是否也有一种方法来表示AND呢?

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


当前回答

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

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

第一个前向中的.*让它在到达"word1"之前匹配任意数量的字符。然后匹配位置被重置,第二个前向查找“word2”。再次重置,最后部分匹配“word3”;因为它是你要检查的最后一个单词,所以它没有必要出现在前瞻中,但这也无妨。

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

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

'm'修饰符用于多行模式;它允许^和$匹配段落边界(regex术语为“行边界”)。在这种情况下,重要的是不要使用's'修饰符,它允许点元字符匹配换行符以及所有其他字符。

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

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

其他回答

在正则表达式之外使用AND。在PHP中,提前操作符似乎不适合我,相反,我使用了这个

if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
    return true;
else
    return false;

如果密码长度为3个字符或更多,并且密码中没有空格,则上述正则表达式将匹配。

看看这个例子:

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

pattern = "/A AND B/"

它可以在不使用AND操作符的情况下写成这样:

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

PCRE:

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

regexp_match(pattern,data)

除了接受的答案

我将提供一些实际的例子,让你们中的一些人更清楚地了解事情。例如,我们有这三行文本:

[12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x]

点击这里查看demo

这里我们要做的是选择+号,但只有在两个数字后面加空格和四个数字之前。这些是唯一的约束条件。我们将使用这个正则表达式来实现它:

'~(?<=\d{2} )\+(?=\d{4})~g'

注意,如果将表达式分开,将会得到不同的结果。

或者你想在标签之间选择一些文本…但不是标签!然后你可以用:

'~(?<=<p>).*?(?=<\/p>)~g'

对于本文:

<p>Hello !</p> <p>I wont select tags! Only text with in</p> 

点击这里查看demo

如果你使用Perl正则表达式,你可以使用正向预测:

例如

(?=[1-9][0-9]{2})[0-9]*[05]\b

是否有大于100且能被5整除的数

顺序总是隐含在正则表达式的结构中。为了实现您想要的结果,您必须针对不同的表达式多次匹配输入字符串。

您想要做的事情是无法通过单个regexp实现的。