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

2 つの問題があります。

1) 一致を文字列の最後に固定しています。つまり、一致する値は「n...a」であり、「n...n」ではありません。

2) 真ん中の「n」は最初のマッチで消費されるため、2 番目のマッチには使用できません。その「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"最初の一致でそれが消費される「理由」は、「cats」と一致したときに「s」で終わるすべての単語が「ts」、「ats」、および「cats」を返すように設計された、のような正規表現を防ぐためだと思います.

于 2013-01-25T17:59:11.643 に答える
-3

Regex 機構は1 つの一致を行います。さらに必要な場合は、最初の一致の後に自分で再起動する必要があります。

于 2013-01-25T17:50:49.743 に答える