クラスでは、正規表現にはキャプチャと非Pattern
キャプチャの2種類があると書かれていますが、違いがわかりません。
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#special
それらはどう違いますか?それぞれをいつ使用する必要がありますか?例はありますか?
クラスでは、正規表現にはキャプチャと非Pattern
キャプチャの2種類があると書かれていますが、違いがわかりません。
http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#special
それらはどう違いますか?それぞれをいつ使用する必要がありますか?例はありますか?
さまざまなものを1つの位置でチェックする必要があるパターンを考えてみましょう。たとえば、2つの異なる2つの文字パターンの束などです。通常、|
交互演算子を使用します。
/(ab|cd|ef)/
()
ブラケットも使用する必要があります。ただし、これらのブラケットはキャプチャグループとしても機能します。たぶん、あなたは本当にそれらの文字シーケンスをキャプチャしたくないでしょう、ただそれらの存在をチェックしてください、それは非キャプチャグループが作用するところです:
/(?:ab|cd|ef)/
何かをキャプチャする式とは別に、式をグループ化することをお勧めします。例えば:
abc(foo|bar)def
「abdfoodef」または「abcbardef」のいずれかに一致させたいが、他のバリエーションは一致させたくない場合、これは最も単純な式です。を使用するには、を使用()
して2つの式をグループ化する必要がありました|
。しかし、これはまた、それ(foo|bar)
が最初のキャプチャグループであることを意味します。
キャプチャが必要ない、または必要ない場合は、キャプチャしないグループとして記述します。
abc(?:foo|bar)def
キャプチャ/非キャプチャは、正規表現全体を指すのではなく、グループ、つまり括弧で囲まれた式を指します。
あなたは__したいですか
はいの場合は、グループをキャプチャする必要があります。
そうでない場合は、優先順位の制御に括弧を使用しており、グループを非キャプチャーにすることができます。
キャプチャグループを使用すると、正規表現の一致の一部を再利用できます。正規表現内で、または後で、たとえば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で試してみて ください。キャプチャグループがどこにあるかを確認できます。
次のような名前付きキャプチャグループを作成することもできます。
(?<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"
これは、試合をそれ自体に置き換えるだけです...しかし、あなたはそれで創造的になることができます。
お役に立てれば。