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)/?打印“是”:打印“否”