2

クラスでは、正規表現にはキャプチャPatternキャプチャの2種類があると書かれていますが、違いがわかりません。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#special

それらはどう違いますか?それぞれをいつ使用する必要がありますか?例はありますか?

4

5 に答える 5

4

さまざまなものを1つの位置でチェックする必要があるパターンを考えてみましょう。たとえば、2つの異なる2つの文字パターンの束などです。通常、|交互演算子を使用します。

/(ab|cd|ef)/

()ブラケットも使用する必要があります。ただし、これらのブラケットはキャプチャグループとしても機能します。たぶん、あなたは本当にそれらの文字シーケンスをキャプチャしたくないでしょう、ただそれらの存在をチェックしてください、それは非キャプチャグループが作用するところです:

/(?:ab|cd|ef)/
于 2012-11-17T14:44:09.603 に答える
3

何かをキャプチャする式とは別に、式をグループ化することをお勧めします。例えば:

abc(foo|bar)def

「abdfoodef」または「abcbardef」のいずれかに一致させたいが、他のバリエーションは一致させたくない場合、これは最も単純な式です。を使用するには、を使用()して2つの式をグループ化する必要がありました|。しかし、これはまた、それ(foo|bar)が最初のキャプチャグループであることを意味します。

キャプチャが必要ない、または必要ない場合は、キャプチャしないグループとして記述します。

abc(?:foo|bar)def
于 2012-11-17T14:45:46.527 に答える
1

キャプチャ/非キャプチャは、正規表現全体を指すのではなく、グループ、つまり括弧で囲まれた式を指します。

あなたは__したいですか

  • 後方参照を使用しますか?
  • 試合全体の特定の部分を取得しますか?(または複数)

はいの場合は、グループをキャプチャする必要があります。

そうでない場合は、優先順位の制御に括弧を使用しており、グループを非キャプチャーにすることができます。

于 2012-11-17T14:55:18.443 に答える
1

キャプチャグループを使用すると、正規表現の一致の一部を再利用できます。正規表現内で、または後で、たとえばreplaceステートメントで再利用できます。

このテキスト:1a2b3cdef7g9hとこの正規表現を検討してください:([0-9] *)([az] *)2つのキャプチャグループがあります。最初のグループは数字のシーケンスをキャプチャし、2番目のグループは文字のシーケンスをキャプチャします。

したがって、replaceAllステートメントを使用して、最初のキャプチャグループ($ 1)を使用して数字を保持したり、2番目のキャプチャグループ($ 2)で文字を保持したりできます。

    // next line outputs : 12379
    System.out.println("1a2b3cdef7g9h".replaceAll("([0-9]*)([a-z]*)", "$1"));

    // next line outputs : abcdefgh
    System.out.println("1a2b3cdef7g9h".replaceAll("([0-9]*)([a-z]*)", "$2"));

ただし、キャプチャしないグループを使用する場合(たとえば、?:を追加すると、キャプチャされないため、便利な場合があります。たとえば、次のようになります。

    // next line outputs : abcdefgh
    //  ([a-z]*) becomes the first capturing group because (?:[0-9]*) is a non-capturing group
    System.out.println("1a2b3cdef7g9h".replaceAll("(?:[0-9]*)([a-z]*)", "$1"));

画面の下部にあるhttp://gskinner.com/RegExrで試してみて ください。キャプチャグループがどこにあるかを確認できます。

参照: http: //www.regular-expressions.info/brackets.html

于 2012-11-17T15:24:25.063 に答える
1

次のような名前付きキャプチャグループを作成することもできます。

(?<telephone>(?:\(\d{2}\)\s\d{4}\s\d{4}))

次のような電話番号と一致します(02) 9502 5697

次に、次のように後方参照として使用できます。

"s/(?<telephone>(?:\(\d{2}\)\s\d{4}\s\d{4}))/\k<telephone>/g"

これは、試合をそれ自体に置き換えるだけです...しかし、あなたはそれで創造的になることができます。

お役に立てれば。

于 2013-11-23T09:20:46.317 に答える