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

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


当前回答

AND运算符在RegExp语法中是隐式的。 相反,必须使用管道指定OR操作符。 下面的RegExp:

var re = /ab/;

意思是字母a和字母b。 它还适用于组:

var re = /(co)(de)/;

它的意思是基团co和基团de。 将(隐式的)AND替换为OR需要以下几行代码:

var re = /a|b/;
var re = /(co)|(de)/;

其他回答

你可以用正则表达式来做,但你可能会想用其他的表达式。例如,使用几个regexp并将它们组合在一个if子句中。

你可以用一个标准的regexp枚举所有可能的排列,像这样(以任意顺序匹配a, b和c):

(abc)|(bca)|(acb)|(bac)|(cab)|(cba)

但是,如果有多个项,这会使regexp变得非常长,而且可能效率很低。

如果您使用的是一些扩展的regexp版本,比如Perl或Java的,它们有更好的方法来实现这一点。其他答案建议使用正前向运算。

在你的情况下,对几个匹配的结果做AND是不是不可能?在伪代码

regexp_match(pattern1, data) && regexp_match(pattern2, 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

看看这个例子:

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

pattern = "/A AND B/"

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

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

PCRE:

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

regexp_match(pattern,data)

AND运算符在RegExp语法中是隐式的。 相反,必须使用管道指定OR操作符。 下面的RegExp:

var re = /ab/;

意思是字母a和字母b。 它还适用于组:

var re = /(co)(de)/;

它的意思是基团co和基团de。 将(隐式的)AND替换为OR需要以下几行代码:

var re = /a|b/;
var re = /(co)|(de)/;