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