给定以下代码:

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,因此我可能缺少一个明显而优雅的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top