给出以下代码:
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"
。我该怎么做才能包含重叠?
答案 0 :(得分:1)
在我看来,只要找到第一个有效匹配,regexp解析器就会删除匹配字符串。我现在没有Windows编译器设置所以我不能进行苹果对比,但我在perl中看到类似的结果。
我认为你的正则表达式在加入后会看起来像这样。
'\ b(红色衬衫|蓝色|绿色|红色)\ b'
测试这个正则表达式我看到的结果与“红色衬衫”,“蓝色”相同。 将“红色衬衫”移动到正则表达式列表的末尾。
'\ b(红色|蓝色|绿色|红色衬衫)\ b'
我现在看到“红色”,“蓝色”。
通过将正则表达式更改为更复杂的方法,您可以获得所需的结果。
\ b(蓝色|绿色|(红色)衬衫)\ b
这应该将红色作为自己的子组和红色衬衫作为一组匹配。
返回“红色衬衫”,“红色”,“蓝色”
更简单的方法是遍历你的字符串列表并一次匹配1,如果你有许多单词组需要多个匹配,如红色和红色衬衫。
由于regexp有很多方法,我可能错过了一个明显而优雅的解决方案。