我正在尝试转换搜索查询,如下所示:
bridge AND (car OR boat)
进入与此匹配的正则表达式:
My car goes over bridge.
我接近它(我想),这是我到目前为止所做的:
.*(bridge).*(car|boat)
虽然这不起作用,但确实如此:
.*(car|boat).*(bridge)
我的正则表达式似乎取决于字符串中单词的顺序。有没有办法匹配参数而不关心它们的顺序是什么?
答案 0 :(得分:2)
简短回答:不,不是一个正则表达式。正则表达式用于匹配有序字符序列。
可以生成一种明确允许两种排序的模式。即如果您想以任何顺序匹配A或B,您将生成如下内容:(?:.*A.*B)|(?:.*B.*A)
。但如果术语数量增加,覆盖所有排列将产生相当大的正则表达式。
更好的解决方案可能是将每个术语与单独的正则表达式匹配,并自行组合匹配,例如:通过实现一个简单的布尔表达式树。
答案 1 :(得分:1)
您可以使用先行断言(?= ... )
来完成此任务。在处理交替(|)时,这样的断言将克服排列的负担。
例如:
^(?=.*?\bbridge\b)(?=.*?\b(car|boat)\b)
由于断言是“零宽度”,在此示例中,一旦判断了断言,您仍然处于字符串的开头。实际上,这种模式表示“匹配字符串的开头”,并且“确保在字符串开头之后的某个时刻找到”桥“和”汽车或船“两者。
每个断言都对应于查询的AND部分; OR将由交替处理。当您的查询发生更改时,这可能会发生变化,但您的示例仍然适用。