提问人:hugoware 提问时间:1/23/2009 最后编辑:vijroxhugoware 更新时间:3/3/2023 访问量:1212292
正则表达式:是否有 AND 运算符?
Regular Expressions: Is there an AND operator?
答:
顺序始终隐含在正则表达式的结构中。为了实现你想要的,你必须将输入字符串与不同的表达式进行多次匹配。
您想要执行的操作无法使用单个正则表达式。
评论
在您的情况下,是否不可能对多个匹配结果执行 AND?在伪代码中
regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...
评论
使用非消耗性正则表达式。
典型的(即Perl/Java)表示法是:
(?=
经验)
这意味着“匹配 expr,但之后继续在原始匹配点匹配”。
你可以随心所欲地做这些事,这将是一个“和”。例:
(?=match this expression)(?=match this too)(?=oh, and this)
如果需要在非消费表达式中保存某些数据,您甚至可以在其中添加捕获组。
评论
如果使用 Perl 正则表达式,则可以使用正 lookahead:
例如
(?=[1-9][0-9]{2})[0-9]*[05]\b
将是大于 100 且可被 5 整除的数字
你可以用正则表达式来做到这一点,但你可能想要其他一些。例如,使用多个正则表达式并将它们组合在一个 if 子句中。
您可以使用标准正则表达式枚举所有可能的排列,如下所示(按任意顺序匹配 a、b 和 c):
(abc)|(bca)|(acb)|(bac)|(cab)|(cba)
但是,如果您有多个术语,则会产生一个非常长且可能效率低下的正则表达式。
如果你使用的是一些扩展的正则表达式版本,比如Perl的或Java的,他们有更好的方法来做到这一点。其他答案建议使用积极的前瞻操作。
评论
a(bc|cb)|b(ac|ca)|c(ab|ba)
正如其他一些响应者所说,您需要使用 lookahead,但 lookahead 必须考虑其目标单词和当前匹配位置之间的其他字符。例如:
(?=.*word1)(?=.*word2)(?=.*word3)
在第一次展望中,它允许它在到达“word1”之前匹配所需的任何字符数。然后重置匹配位置,第二个展望寻找“word2”。再次重置,最后一部分匹配“word3”;由于这是您要检查的最后一个单词,因此没有必要将其放在展望中,但它不会造成伤害。.*
为了匹配整个段落,您需要在两端锚定正则表达式并添加一个 final 以消耗剩余的字符。使用 Perl 风格的表示法,这将是:.*
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
“m”修饰符用于多行模式;它允许 AND 在段落边界处匹配(正则表达式中的“行边界”)。在这种情况下,您不能使用“s”修饰符,它允许点元字符与换行符以及所有其他字符匹配。^
$
最后,你要确保你匹配的是整个单词,而不仅仅是较长单词的片段,所以你需要添加单词边界:
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m
评论
.*
[\s\S]*
.
请看这个例子:
我们有 2 个正则表达式 A 和 B,我们希望匹配它们,因此在伪代码中它看起来像这样:
pattern = "/A AND B/"
它可以在不使用 AND 运算符的情况下编写,如下所示:
pattern = "/NOT (NOT A OR NOT B)/"
在PCRE中:
"/(^(^A|^B))/"
regexp_match(pattern,data)
评论
(?=expr)
^
^
/(^(^A|^B))/
^
(?!…)
(?!(?!A)|(?!B))
^
在正则表达式之外使用 AND。在 PHP lookahead 运算符中似乎对我不起作用,而是我使用了这个
if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
return true;
else
return false;
如果密码长度为 3 个字符或更多,并且密码中没有空格,则上述正则表达式将匹配。
为什么不使用 awk?
使用 awk 正则表达式 AND,OR 问题就是这么简单
awk '/WORD1/ && /WORD2/ && /WORD3/' myfile
AND 运算符隐含在 RegExp 语法中。
OR 运算符必须使用管道指定。
以下正则表达式:
var re = /ab/;
表示字母 AND 字母 。
它还适用于组:a
b
var re = /(co)(de)/;
它意味着组 AND 组 .
将(隐式)AND 替换为 OR 需要以下行:co
de
var re = /a|b/;
var re = /(co)|(de)/;
评论
a
b
|
您可以将输出通过管道传递到另一个正则表达式。使用 grep,您可以这样做:
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]
在这里看演示 DEMO
我们在这里要做的是选择 + 号,但前提是它在两个带空格的数字之后并且它位于四个数字之前。这些是唯一的限制。我们将使用这个正则表达式来实现它:
'~(?<=\d{2} )\+(?=\d{4})~g'
请注意,如果将表达式分开,则会给出不同的结果。
或者,也许您想在标签之间选择一些文本......但不是标签!然后,您可以使用:
'~(?<=<p>).*?(?=<\/p>)~g'
对于这段文字:
<p>Hello !</p> <p>I wont select tags! Only text with in</p>
在这里看演示 DEMO
评论
((yes).*(no))|((no).*(yes))
将匹配同时具有两者的句子,无论它们出现的顺序如何:yes
no
Do i like cookies? **Yes**, i do. But milk - **no**, definitely no.
**No**, you may not have my phone. **Yes**, you may go f yourself.
将两者匹配,忽略大小写。
评论
以下是“and”运算符的可能“形式”:
以以下正则表达式为例:
如果我们想匹配没有“e”字符的单词,我们可以这样做:
/\b[^\We]+\b/g
\W
表示不是“单词”字符。^\W
表示“单词”字符。[^\We]
表示“单词”字符,但不是“e”。
查看实际操作:不带 E 的 Word
正则表达式的“and”运算符
我认为这种模式可以用作正则表达式的“and”运算符。
一般而言,如果:
A = not a
B = not b
然后:
[^AB] = not(A or B)
= not(A) and not(B)
= a and b
差集
因此,如果我们想在正则表达式中实现差分集的概念,我们可以这样做:
a - b = a and not(b)
= a and B
= [^Ab]
常见情况:
在javascript中,你可以这样做:
如果要检查密码是否同时包含小字母和大字母,请使用以下命令:
passwordValue.search(/[a-z]/) !== -1 && passwordValue.search(/[A-Z]/) !== -1
如果密码输入同时包含小字母和大字母,则此语句返回 true,否则返回 false。
评论
I'd like to match paragraphs of text
(?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2}
(?=.*\bphrase1\b)(?=.*\bphrase2\b)
|
|