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

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


当前回答

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

例如

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

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

其他回答

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

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

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

regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...

下面是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]

为什么不用awk呢? 用awk regex AND, OR的问题是如此简单

awk '/WORD1/ && /WORD2/ && /WORD3/' myfile

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

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

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

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

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