如何防止正则表达式在替代品的第一场比赛中停止?

时间:2010-05-05 13:32:14

标签: c# regex

如果我有字符串hello world,我该如何修改正则表达式world|wo|w以便它匹配所有“world”,“wo”和“w”而不仅仅是单个第一个匹配它的“世界”是什么?

如果直接无法做到这一点,是否有一个好的解决方法?我正在使用C#,如果它有所作为:

Regex testRegex = new Regex("world|wo|w");
MatchCollection theMatches = testRegex.Matches("hello world");
foreach (Match thisMatch in theMatches)
{
   ...
}

3 个答案:

答案 0 :(得分:2)

我认为你需要使用三个独立的正则表达式并匹配它们。当您指定备选方案时,它会认为每个备选方案都是成功匹配,并且在匹我能看到的唯一方法就是在单独的正则表达式中重复搜索每个替代方案。您可以创建一个数组或匹配项列表,如果您希望以后能够迭代它们,可以将每个搜索添加到列表中。

答案 1 :(得分:1)

如果您尝试将单词world匹配(开头)三次,则需要使用三个单独的Regex对象;单个正则表达式不能匹配相同的字符两次。

答案 2 :(得分:1)

正如SLaks所写,正则表达式不能多次匹配同一文本。

你可以像这样“假装”:

\b(w)((?<=w)o)?((?<=wo)rld)?
只有在w *之前,

才会匹配ow,只有rld之后才会wo

当然,实际上只会匹配单词的一部分,但是你会看到只有第一个,前两个或所有部分通过查看捕获的组来匹配。

因此,在单词want中,w将匹配(其余为可选,因此正则表达式报告整体成功。

work中,wo将匹配; \1将包含w\2将包含orld将失败,但由于它是可选的,因此正则表达式仍会报告成功。

我在正则表达式的开头添加了一个单词边界锚\b,以避免在reword之类的单词中间匹配;如果您不想排除这些匹配项,请删除\b


*这里实际上并不需要(?<=w),但为了保持一致,我保持了它。