查找模式的所有匹配项是否重叠

时间:2014-12-21 18:27:07

标签: c# .net regex

我的方法中有这个片段:

MatchCollection words = Regex.Matches("dog cat fun toy", @"\w\w\w.\w?");
foreach (Match match in words)
{
    Console.WriteLine(match);
}

我希望看到类似的东西:

  狗c   猫f
  有趣的是

但是程序想出了:

  狗c   有趣的是

根据我的理解,它跳过第二次出现,因为它的一部分是先前发生的。但我仍然希望看到它。我应该如何纠正我的片段?

2 个答案:

答案 0 :(得分:0)

你可以试试这样的事情

var regX = new Regex(@"\w\w\w.\w?");
string pattern = "dog cat fun toy";

int i = 0;
while (i < pattern.Length)
{
    var m = regX.Match(pattern, i);
    if (!m.Success) break;

    Console.WriteLine(m.Value);
    i = m.Index + 1;
}

答案 1 :(得分:0)

即使它不是一个通用解决方案,但与您相关,下面的代码片段可以完成这项工作:

string _input = "dog cat fun toy";
string[] _arr = _input.Split(' ');
string _out = String.Empty;
for (int i = 0; i < _arr.Length-1; i++)
{
    if (_arr[i].Length == 3) { _out+=_arr[i]+" "+_arr[i+1].Substring(0,1)+";";}
}

其中字符串_ out包含由&#34; ;&#34;分隔的所有匹配项(或任何其他char)。或者,您可以将输出发送到控制台:

string _input = "dog cat fun toy";
string[] _arr = _input.Split(' ');
for (int i = 0; i < _arr.Length-1; i++)
{
    if (_arr[i].Length == 3) {Console.WriteLine(_arr[i]+" "+_arr[i+1].Substring(0,1));}
}

希望这可能会有所帮助。