1

给定以下代码:

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". 我可以做些什么来包括重叠?

4

1 回答 1

1

在我看来,只要找到第一个有效匹配项,正则表达式解析器就会删除匹配字符串。我现在没有 Windows 编译器设置,所以我无法进行苹果与苹果的比较,但我在 perl 中看到了类似的结果。

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

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

测试这个正则表达式,我看到与“red shirt”、“blue”相同的结果。通过将“red shirt”移动到正则表达式列表的末尾。

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

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

通过将正则表达式更改为更复杂的方法,您可能能够获得您想要的结果。

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

这应该匹配 red 作为它自己的子组和 red shirt 作为一个组。

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

更简单的方法是遍历您的字符串列表并一次匹配 1 个,如果您将有许多单词组需要多个匹配项,例如 red 和 red shirt。

由于有很多方法可以做正则表达式,我可能错过了一个明显而优雅的解决方案。

于 2010-10-22T15:30:29.993 回答