正则表达式没有给出所有可能的匹配

时间:2013-06-20 17:35:00

标签: c# regex overlapping-matches

我需要为c#中的给定正则表达式和单词获取所有可能的匹配项。但是Regex.Matches()函数没有给出它。例如。

Regex.Matches("datamatics","[^aeiou]a[^aeiou]")

只返回两个匹配的

dat
mat

它没有给出“tam”作为匹配。有人可以向我解释为什么它没有给出“tam”作为匹配,我怎么能得到所有这三个?

2 个答案:

答案 0 :(得分:1)

使用此正则表达式

(?<=([^aeiou]))a(?=([^aeiou]))

.net支持lookarounds..cheers中的群组捕获

您的代码将是

var lst= Regex.Matches(input,regex)
              .Cast<Match>()
              .Select(x=>x.Groups[1].Value+"a"+x.Groups[2].Value)
              .ToList();

现在你可以迭代lst

foreach(String s in lst)
{
     s;//required strings
}

答案 1 :(得分:0)

您无法在Regex中获得重叠匹配。但是,您有几种方法可以解决它。您可以使用Regex.Match,并指定起始索引(使用循环遍历整个字符串),也可以使用lookbehinds或lookaheads,如下所示:

  (?=[^aeiou]a)[^aeiou]

这是有效的,因为lookbehinds和lookaheads不会消耗字符。它返回一个Match,其中包含匹配的索引。你需要使用它而不是捕获,因为只捕获了一个字符。