2

我正在使用正则表达式,我写了这个:

 static void Main(string[] args)
    {
        string test = "this a string meant to test long space recognition      n       a";
        Regex regex = new Regex(@"[a-z][\s]{4,}[a-z]$");
        MatchCollection matches = regex.Matches(test);
        if (matches.Count > 1)
            Console.WriteLine("yes");
        else
        {
            Console.WriteLine("no");
            Console.WriteLine("the number of matches is "+matches.Count);
        }
    }

在我看来,Matches 方法应该同时找到“n n”和“n a”。尽管如此,它只能找到“n n”,我只是不明白为什么会这样..

4

4 回答 4

2

$则表达式中的 表示模式必须出现在行尾。如果你想找到所有的长空格,这个简单的表达式就足够了:

\s{4,}

如果你真的需要知道空格是否被az包围,你可以这样搜索

(?<=[a-z])\s{4,}(?=[a-z])

这使用模式...

(?<=prefix)find(?=suffix)

...并查找包含在前缀和后缀之间的位置。前缀和后缀不是匹配的一部分,即match.Value只包含连续的空格。因此,您不会得到Jon Skeet 提到的“n”消耗问题。

于 2013-01-25T17:57:17.363 回答
1

你有两个问题:

1)您将匹配锚定到字符串的末尾。所以实际上,匹配的值是“n...a”,而不是“n...n”

2)中间的“n”被第一场比赛消耗掉,所以不能成为第二场比赛的一部分。如果您将“n”更改为“nx”(并删除 $),您将看到“n...n”和“x...a”

简短但完整的示例:

using System;
using System.Text.RegularExpressions;

public class Test
{
    static void Main(string[] args)
    {
        string text = "ignored a      bc       d";
        Regex regex = new Regex(@"[a-z][\s]{4,}[a-z]");
        foreach (Match match in regex.Matches(text))
        {
            Console.WriteLine(match);
        }
    }
}

结果:

a      b
c       d
于 2013-01-25T17:52:38.010 回答
0

I just do not understand why is that..

我认为第一场比赛消耗它的“为什么”是为了防止正则表达式"\\w+s",旨在让每个以“s”结尾的单词在与“cats”匹配时返回“ts”、“ats”和“cats” .

于 2013-01-25T17:59:11.643 回答
-3

Regex 机器会进行一次匹配,如果您想要更多,则必须在第一次匹配后自己重新启动它。

于 2013-01-25T17:50:49.743 回答