1

我正在尝试转换这样的搜索查询:

bridge AND (car OR boat)

进入与此匹配的正则表达式:

My car goes over bridge.

我接近得到它(我认为),这就是我到目前为止所拥有的:

.*(bridge).*(car|boat)

虽然这不起作用,但是这样做:

.*(car|boat).*(bridge)

我的正则表达式似乎取决于字符串中单词的顺序。有没有办法匹配参数而不关心它们的顺序?

4

2 回答 2

2

简短的回答:不,不是在一个正则表达式中。正则表达式用于匹配有序的字符序列。

当然,您可以生成一个明确允许两种排序的模式。即,如果您想以任何顺序匹配 A 或 B,您将生成如下内容:(?:.*A.*B)|(?:.*B.*A)。但是如果术语数量增加,覆盖所有排列将产生相当大的正则表达式。

更好的解决方案可能是将每个术语与一个单独的正则表达式匹配,然后自己组合匹配项,例如通过实现一个简单的布尔表达式树。

于 2013-03-07T21:38:41.440 回答
1

您可以使用前瞻断言(?= ... )来完成此操作。在处理交替 (|) 时,这样的断言将克服排列的负担。

例如:

^(?=.*?\bbridge\b)(?=.*?\b(car|boat)\b)

由于断言是“零宽度”,因此在此示例中,一旦评估了任一断言,您仍处于字符串的开头。实际上,此模式表示“匹配字符串的开头”,并且“确保在字符串开头之后的某个点找到“桥”和“汽车或船”。

每个断言都对应于查询的 AND 部分;OR 将由交替处理。当您的查询更改时,这可能会更改,但适用于您的示例。

于 2013-03-07T21:47:56.753 回答