单词边界发行问题(重叠)
-
10-10-2019 - |
题
给定以下代码:
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"
. 。我该怎么做才能包括重叠?
解决方案
在我看来,Regexp Parser一旦找到第一个有效的匹配项就会删除比赛字符串。我现在没有Windows编译器设置,因此我无法为苹果进行比较,但我在Perl中看到了类似的结果。
我认为您的正则是加入后看起来像这样的。
' b(红色衬衫|蓝色|绿色|红色) b'
测试此REGEXP,我看到的结果与“红色衬衫”,“蓝色”相同。通过将“红色衬衫”移至Regexp列表的尽头。
' b(红色|蓝色|绿色|红色衬衫) b'
我现在看到“红色”,“蓝色”。
通过将REGEXP更改为一种更复杂的方法,您可能可以实现所需的结果。
b(蓝色|绿色|(红色)衬衫) b
这也应该与红色作为自己的子组和红色衬衫匹配。
返回“红色衬衫”,“红色”,“蓝色”
这样做的简单方法是,如果您要有许多单词组需要多个匹配项,例如红色和红色衬衫,则循环遍历您的字符串列表并一次匹配1。
由于有很多方法可以做REGEXP,因此我可能缺少一个明显而优雅的解决方案。
不隶属于 StackOverflow