Regex 正则表达式:有AND运算符吗?

Regex 正则表达式:有AND运算符吗?,regex,lookahead,Regex,Lookahead,显然,您可以使用|(管道?)来表示或,但是有没有一种方法可以同时表示和 具体来说,我希望匹配包含所有特定短语的文本段落,但没有特定的顺序。正则表达式的结构中始终隐含着顺序。要实现所需的功能,必须将输入字符串与不同的表达式进行多次匹配 您想用单个regexp执行的操作是不可能的。在您的情况下,是否不可能对多个匹配结果执行AND操作?伪码 regexp_match(pattern1, data) && regexp_match(pattern2, data) && .

显然,您可以使用
|
(管道?)来表示
,但是有没有一种方法可以同时表示


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

正则表达式的结构中始终隐含着顺序。要实现所需的功能,必须将输入字符串与不同的表达式进行多次匹配


您想用单个regexp执行的操作是不可能的。

在您的情况下,是否不可能对多个匹配结果执行AND操作?伪码

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

使用非消耗性正则表达式

典型的(即Perl/Java)表示法是:

(?=
expr

这意味着“匹配表达式,但在此之后,在原始匹配点继续匹配。”

您可以根据需要执行任意多个操作,这将是一个“和”示例:

(?=匹配这个表达式)(?=也匹配这个)(?=哦,还有这个)


如果需要保存非消费表达式中的一些数据,甚至可以在非消费表达式中添加捕获组。

如果使用Perl正则表达式,则可以使用正向前瞻:

比如说

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

如果是大于100且可被5整除的数字,则可以使用正则表达式进行此操作,但可能需要使用其他表达式。例如,使用几个regexp并将它们组合在一个if子句中

您可以使用标准regexp枚举所有可能的置换,如下所示(以任意顺序匹配a、b和c):

但是,如果您有多个术语,那么这会产生一个非常长且可能效率低下的regexp


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

正如其他一些响应者所说,您需要使用先行操作,但先行操作必须考虑其目标单词和当前匹配位置之间的其他字符。例如:

(?=.*word1)(?=.*word2)(?=.*word3)
第一个前瞻中的
*
允许它在到达“word1”之前匹配所需的字符数。然后重置匹配位置,第二个前瞻查找“word2”。再次重置,最后一部分匹配“word3”;因为这是你要检查的最后一个词,所以没有必要把它放在前面看,但它不会伤害你

为了匹配整个段落,您需要在两端锚定正则表达式,并添加一个final
*
来使用剩余的字符。使用Perl风格的表示法,即:

/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
“m”修饰符用于多行模式;它允许
^
$
在段落边界处匹配(“正则表达式中的行边界”)。在这种情况下,必须而不是使用“s”修饰符,该修饰符允许点元字符与换行符以及所有其他字符匹配

最后,您要确保匹配的是整个单词,而不仅仅是较长单词的片段,因此需要添加单词边界:

/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m
看看这个例子:

我们有两个regexp A和B,我们希望两者都匹配,因此在伪代码中,它如下所示:

pattern = "/A AND B/"
pattern = "/NOT (NOT A OR NOT B)/"
无需使用AND运算符即可写入,如下所示:

pattern = "/A AND B/"
pattern = "/NOT (NOT A OR NOT B)/"
在PCRE中:

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

regexp_match(pattern,data)

在正则表达式之外使用和。在PHP中,lookahead操作符似乎对我不起作用,相反,我使用了这个

if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
    return true;
else
    return false;
如果密码长度为3个或更多字符且密码中没有空格,则上述正则表达式将匹配。

为什么不使用awk?
有了awk正则表达式和OR,事情就这么简单了

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

AND运算符在RegExp语法中是隐式的。
必须使用管道指定OR运算符。
以下RegExp:

var re = /ab/;
表示字母
a
b

它也适用于以下群体:

var re = /(co)(de)/;
它表示集团
co
de

用OR替换(隐式)和将需要以下行:

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

您可以通过管道将输出传输到另一个正则表达式。使用grep,您可以执行以下操作:

/\b[^\We]+\b/g
a - b = a and not(b)
      = a and B
      = [^Ab]

grep A | grep B
除了公认的答案之外

我将向你们提供一些实际的例子,让你们中的一些人更清楚地了解情况。例如,假设我们有三行文字:

[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]
请参见此处的演示

这里我们要做的是选择+号,但前提是它在两个带空格的数字之后,并且在四个数字之前。这些是唯一的限制。我们将使用此正则表达式来实现它:

'~(?<=\d{2} )\+(?=\d{4})~g'
“~(?
((是)。*(否))|((否)。*(是))

将匹配同时具有
yes
no
的句子,无论它们出现的顺序如何:

我喜欢饼干吗?**是的**,我喜欢。但是牛奶-**不**,绝对不喜欢。

**不**,你可能没有我的手机。**是的**,你可以自己去。

将两者匹配,忽略大小写。

这里有一个可能的“和”运算符的“形式”:

以下面的正则表达式为例:

如果要匹配不带“e”字符的单词,可以执行以下操作:

/\b[^\We]+\b/g
a - b = a and not(b)
      = a and B
      = [^Ab]
  • \W
    表示不是“单词”字符
  • ^\W
    表示“单词”字符
  • [^\We]
    表示“单词”字符,但不是“e”
在行动中看到它:

正则表达式的“and”运算符 我认为这个模式可以用作正则表达式的“”操作符

一般而言,如果:

  • A=非A
  • B=非B
然后:

差集 因此,如果我们想在正则表达式中实现的概念,我们可以这样做:

/\b[^\We]+\b/g
a - b = a and not(b)
      = a and B
      = [^Ab]
perl-e“q{some stuff and things}=~/(?=some)(?=stuff)(?=things)/?打印“是”:打印“否”