8

誰かが次のコードを説明するのを手伝ってくれませんか? ありがとう。正規表現のグループ化について少し混乱しています。

public static String evaluate(String s) {
    if (s == null) return "";

    Matcher m = Pattern.compile("[0-9]*").matcher(s);

    if (m.find()) {
        MatchResult mr = m.toMatchResult();
        return mr.group(0);
    }
    return "";
}
4

2 に答える 2

20

これにより、グループ 0がより明確になることを願っています。

例:

    String str = "start123456end"; // Your input String


    //                                 Group#1 Group#2
    //                                   |      |  
    Pattern p = Pattern.compile("start([0-9]*)(end)");
    //                           |<--- Group#0 --->|


    Matcher m = p.matcher(str); // Create a matcher for regex and input

    while( m.find() ) // As long as your regex matches something
    {
        System.out.println("group#0:\t" + m.group()); // Or: m.group(0)
        System.out.println("group#1:\t" + m.group(1));
        System.out.println("group#2:\t" + m.group(2));
    }

出力:

group#0:    start123456end
group#1:    123456
group#2:    end

正規表現の一部をグループに「保存」できます。私の例では、それらのうちの 3 つがあります (グループは と の間に(あり)ます):

  • グループ 1:開始語と終了語の間の数字。
  • グループ 2:末尾の単語のみ
  • グループ 0:パターンに一致するすべてのものです。グループ 0 は予約されており、常に一致全体を返しますが、他のすべてはオプションであり、ユーザーが定義します。

あなたのコードによると:

例:

Matcher m = Pattern.compile("[0-9]*").matcher("123456end"); // Matches all numbers

if( m.find() )
{
    System.out.println(m.group(0)); // m.group() possible too
}

グループは 1 つだけです: 0!

出力: 123456 (= グループ 0)

次に、さらにいくつかのグループをパターンに入れましょう。

コード:

    //                            Group#1      Group#2
    //                              |            |
    Matcher m = Pattern.compile("([0-9])[0-9]([0-9])*").matcher(str); // Matches all numbers
    //                           |<---- Group#0 ---->|

    if( m.find() )
    {
        System.out.println("group#0:\t" + m.group(0)); // m.group() possible too
        System.out.println("group#1:\t" + m.group(1)); // 1st digit
        System.out.println("group#2:\t" + m.group(2)); // 3rd digit
    }

現在、あと 2 つのグループがあります。

出力:

group#0:    123456
group#1:    1
group#2:    6

このドキュメントをお勧めします:レッスン: 正規表現。実際に最初の章から始めて、自分で例を試してみてください。

追加:

于 2013-01-23T16:10:06.527 に答える
10

ドキュメントから:

グループ 0 はパターン全体を表すため、式m.group(0)は と同等m.group()です。

つまり、mr.group(0)試合全体です。

于 2013-01-17T18:39:28.713 に答える