Java 正規表現の後方参照は、Java エンジンによってサポートされる非常に便利な機能です。
バックリンクとは何かを理解するには、まずグループとは何なのかを理解する必要があり
ます。正規表現におけるグループは、複数の文字を 1 つの単位として扱います。グループは、文字を括弧「()」で囲んで作成します。括弧 1 組が 1 つのグループです。バックリンクは、検索パターンを直接コピーせずに繰り返すことができるため便利です。
\Nのような構造を使用して、以前に定義したグループを参照する必要があるだけです(
Nはグループ番号です)。次の 2 つの例は、バックリンクの利便性を実感していただくためのものです。
例 1: 繰り返しパターンの検索
(\d\d\d)\1 という形式の構造は、行 123123 に一致しますが、行 123456 には一致しません。String str = "ля123123ля"; Pattern p = Pattern.compile("(\\d\\d\\d)\\1"); Matcher m = p.matcher(str); System.out.println(m.groupCount()); while (m.find()) { String word = m.group(); System.out.println(word + " " + m.start() + " " + m.end()); }
出力:
1 123123 2 8
翻訳者のメモ! ここで、翻訳者として、少し自由をとって私自身からのコメントを挿入したいと思います。私自身正規表現について勉強しているところなので、悪口で訂正してもらえることを願っています :) 以下に書いた内容が間違いであれば: 1) groupCount () メソッド パターンで指定されたグループの数を返す
ため 、入力文字列が「la123"
456 la" でテンプレートに適合しない場合でも、数値 1 が画面に表示されます。 2) find() メソッド
次 のグループを検索しますが、ブール値のみを返します。 : true – 見つかった、false – 見つからなかった 3)
group()メソッド パターンから見つかった最後の 1 つの部分文字列を返します。この場合は 123123 4)
start() メソッド ソース文字列内で見つかった部分文字列の位置を返します (もちろん、番号はゼロから始まります) 5) end
() メソッド ソース文字列内で見つかった部分文字列の直後の位置を返します部分文字列。したがって、この値は、ソース文字列内で見つかった部分文字列の最後の文字を指すのではなく、その次の文字を指します。
例 2: 重複する単語の検索
String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b"; Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); String phrase = "unique is not duplicate but unique, Duplicate is duplicate."; Matcher m = p.matcher(phrase); while (m.find()) { String val = m.group(); System.out.println("Найденная последовательность символов: \"" + val + "\""); System.out.println("Слово-дубликат: " + m.group(1) + "\n"); }
結論:
Найденная последовательность символов: "unique is not duplicate but unique" Слово-дубликат: unique Найденная последовательность символов: "Duplicate is duplicate" Слово-дубликат: Duplicate
(正規表現を使用して) 重複する単語を検索するこの方法は最適ではないことに注意してください。たとえば、上の例では、最初の単語「duplicate」がスキップされます。
GO TO FULL VERSION