显然,您可以使用|(管道?)来表示OR,但是是否也有一种方法来表示AND呢?
具体来说,我希望匹配包含某个短语的所有文本段落,但没有特定的顺序。
显然,您可以使用|(管道?)来表示OR,但是是否也有一种方法来表示AND呢?
具体来说,我希望匹配包含某个短语的所有文本段落,但没有特定的顺序。
当前回答
使用非消耗正则表达式。
典型的(例如Perl/Java)表示法是:
(? = expr)
这意味着“匹配expr,但之后继续在原始匹配点进行匹配。”
你想做多少就做多少,这将是一个“并且”。例子:
(?=匹配这个表达式)(?=也配这个)(?=哦,还有这个)
如果需要保存其中的一些数据,甚至可以在非消费表达式中添加捕获组。
其他回答
顺序总是隐含在正则表达式的结构中。为了实现您想要的结果,您必须针对不同的表达式多次匹配输入字符串。
您想要做的事情是无法通过单个regexp实现的。
看看这个例子:
我们有两个正则表达式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)/;
在你的情况下,对几个匹配的结果做AND是不是不可能?在伪代码
regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...
((是的)。* (no)) |((不)。*(是的)
将匹配同时有yes和no的句子,不管它们出现的顺序:
我喜欢饼干吗?**是的**,我喜欢。但是牛奶——**不**,绝对不行。
**不**,你不能拿我的手机。是的,你可以自己去。
将两者都匹配,忽略大小写。