字边界正则表达式问题(重叠)

时间:2010-10-22 14:48:10

标签: c# asp.net regex word-boundary

给出以下代码:

var myList = new List<string> { "red shirt", "blue", "green", "red" };
Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
MatchCollection m = r.Matches("Alfred has a red shirt and blue tie");

我希望m的结果包含"red shirt", "blue", "red",因为所有这些都在字符串中,但我只是"red shirt", "blue"。我该怎么做才能包含重叠?

1 个答案:

答案 0 :(得分:1)

在我看来,只要找到第一个有效匹配,regexp解析器就会删除匹配字符串。我现在没有Windows编译器设置所以我不能进行苹果对比,但我在perl中看到类似的结果。

我认为你的正则表达式在加入后会看起来像这样。

'\ b(红色衬衫|蓝色|绿色|红色)\ b'

测试这个正则表达式我看到的结果与“红色衬衫”,“蓝色”相同。 将“红色衬衫”移动到正则表达式列表的末尾。

'\ b(红色|蓝色|绿色|红色衬衫)\ b'

我现在看到“红色”,“蓝色”。

通过将正则表达式更改为更复杂的方法,您可以获得所需的结果。

\ b(蓝色|绿色|(红色)衬衫)\ b

这应该将红色作为自己的子组和红色衬衫作为一组匹配。

返回“红色衬衫”,“红色”,“蓝色”

更简单的方法是遍历你的字符串列表并一次匹配1,如果你有许多单词组需要多个匹配,如红色和红色衬衫。

由于regexp有很多方法,我可能错过了一个明显而优雅的解决方案。