有没有办法匹配正则表达式参数而不关心它们的顺序?

时间:2013-03-07 21:34:42

标签: .net regex

我正在尝试转换搜索查询,如下所示:

bridge AND (car OR boat)

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

My car goes over bridge.

我接近它(我想),这是我到目前为止所做的:

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

虽然这不起作用,但确实如此:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

例如:

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

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

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