2013-04-16 11 views
5

私はJava OCPのために勉強していますが、現時点では私は"Capturing groups"セクションを理解していません。それは説明として抽象的すぎる方法です。あなたが(時間があれば)「捕獲グループ」を使って実際の例を教えてください。Javaで正規表現の "グループをキャプチャ"しよう

次の声明の具体例を私に提供できる人はいますか?

キャプチャグループは、複数の文字を単一の ユニットとして扱う方法です。それらは、 の中にグループ化される文字をカッコの組にして作成されます。たとえば、正規表現(dog) は、文字「d」「o」および「g」を含む単一のグループを作成します。キャプチャグループに一致する入力文字列の 部分は、バックリファレンスを介して後で呼び出すためにメモリに保存されます(後のセクションの「 」を参照)。

私は、具体的な例を見てすぐに手に入れることができます。

ありがとうございます。

答えて

13

正規表現のさまざまな部分が一致した入力部分を得ることができます。ときには、試合全体が必要な場合もありますが、しばしばその一部だけが必要です。あなたはそれを文字列

Page 14 of 203 

を渡す場合は、文字列全体にマッチします

Page \d+ of \d+ 

:たとえば、この正規表現は"Page X of Y"文字列にマッチします。今度は、14203だけを使いたいとしましょう。問題はありません。regexライブラリでは、2つの文字を括弧で囲んで"14""203"文字列のみを検索します。

Page (\d+) of (\d+) 

上記式は、二つ捕捉基を作成します。

Pattern p = Pattern.compile("Page (\\d+) of (\\d+)"); 
String text = "Page 14 of 203"; 
Matcher m = p.matcher(text); 
if (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 

これは14203を出力:パターンを照合することによって得られMatcherオブジェクトは、個別にこれらのグループのコンテンツを取得することができます。

Demo on ideone

+1

+1の例として、http://stackoverflow.com/questions/16034337/generating-a-regular-expression-from-a-stringを使用してください。 –

1

あなたは試合の部分を記録しておきたいです。たとえば、あなたが正規表現

/^(http|ftp).*/

を持っていて、試合を取得する場合、あなたはグループのために試合を照会することができ、そしてそれはHTTPやFTPであれば教えてください。

0

例えば正規表現

cat (dog)?bus 

に取る。これは、文字列cat dog buscat busの両方にマッチします。?のため、dog部分全体がオプションであるためです。それを括弧で囲まないと、最後のスペースだけがオプションになります。それは全体had、文字列の一つ以上に一致するよう

James while John (had)+a better effect on the teacher 

は、文字列に

James while John had had had had had had had had had had had a better effect on the teacher 

と一致します。

キャプチャグループで交互に参照したり、逆参照を使用したりすることもできます。

(cat|dog) is a \1 

\1は、最初のキャプチャグループでキャプチャされたものへの参照です。これはdog is a dogcat is a catに一致しますが、dog is a catには一致しません。

0

Hereあなたは簡単に理解できるいくつかのコード例があります。

基本的には()以内にあなたが持っているものは、試合後に記憶しています。そして、そのグループと一致する文字列を見ることができます。 2回目のマッチを行う場合、これらの値は2回目のマッチに置き換えられます。必要な場合は、マッチした直後にあなたが定義したバリエーションでそれらを保存する必要があります。

2

キャプチャグループは、文字列の一部が正規表現の特定の部分に対して一致、この例を参照することを何であったかを見つけるためにのMatcherを照会することができます:

String dateStr = "1981-06-25"; 

Pattern datePatt = Pattern.compile("([0-9]{4})/([0-9]{2})/([0-9]{2})"); 
... 
Matcher m = datePatt.matcher(dateStr); 
if (m.matches()) { 
    int year = Integer.parseInt(m.group(1)); 
    int month = Integer.parseInt(m.group(2)); 
    int day = Integer.parseInt(m.group(3)); 
} 

変数年、月をとグループ1、グループ2、グループ3の値がそれぞれ含まれています。

+2

良い例ですが、あなたはどこかで日と月を混在させています(また、日と月を0から99にするのは悪い習慣です)。 – ddmps

+0

Pescisさん、ありがとうございました、混合は今修正されました。これは日付を扱う際のベストプラクティスではありませんが、キャプチャグループを理解するための簡単な例です。 –