パターン(Java Platform SE 7)
正規表現のコンパイル済み表現。
文字列として指定された正規表現は、最初にこのクラスのインスタンスにコンパイルする必要があります。結果のパターンを使用して、任意の文字シーケンス
Matcherオブジェクトを作成できます。 / div>正規表現に対して。マッチの実行に関係するすべての状態はマッチャーに存在するため、多くのマッチャーが同じパターンを共有できます。
したがって、一般的な呼び出しシーケンスは
Pattern p = Pattern.("a*b"); Matcher m = p.("aaaaab"); boolean b = m.();
matches
メソッドは、正規表現が1回だけ使用される場合の便宜のために、このクラスによって定義されています。このメソッドは、式をコンパイルし、1回の呼び出しで入力シーケンスをその式と照合します。ステートメント
boolean b = Pattern.matches("a*b", "aaaaab");
は、上記の3つのステートメントと同等です。ただし、繰り返し一致する場合は、コンパイルされたパターンを再利用できないため、効率が低下します。
このクラスのインスタンスは不変であり、複数の同時スレッドで安全に使用できます。 Matcher
クラスのインスタンスは、このような使用には安全ではありません。
正規表現構造の概要
円記号、エスケープ、引用符
円記号( “\”)は、で定義されているように、エスケープされた構造を導入するのに役立ちます。上記の表、およびエスケープされていない構造として解釈される文字を引用します。したがって、式\\は単一の円記号に一致し、\ {は左中括弧に一致します。
エスケープされた構成を示さないアルファベット文字の前に円記号を使用するとエラーになります。これらは、正規表現言語の将来の拡張のために予約されています。アルファベット以外の文字がエスケープされていない構成の一部であるかどうかに関係なく、その文字の前に円記号を使用できます。
Javaソースコードの文字列リテラル内のバックスラッシュは、Java™言語仕様で要求されているように、Unicodeエスケープ(セクション3.3)またはその他の文字エスケープ(セクション3.10.6)として解釈されます。したがって、バックスラッシュを2倍にする必要があります。 Javaバイトコードコンパイラによる解釈から正規表現を保護するための正規表現を表す文字列リテラル。たとえば、文字列リテラル「\ b」は正規表現として解釈されるときに単一のバックスペース文字に一致し、「\\ b」は単語の境界に一致します。文字列リテラル “\(hello \)”は不正であり、コンパイル時エラーが発生します。文字列(hello)と一致させるには、文字列リテラル “\\(hello \\)”を使用する必要があります。
文字クラス
文字クラスは他の文字クラス内に表示される場合があり、和集合演算子(暗黙的)と交差演算子(& &)。和集合演算子は、そのオペランドクラスの少なくとも1つにあるすべての文字を含むクラスを示します。共通部分演算子は、両方のオペランドクラスにあるすべての文字を含むクラスを示します。
文字クラス演算子の優先順位は、高いものから低いものへと次のとおりです。
1 文字通りのエスケープ \ x 2 グループ化 3 範囲 az 4 ユニオン 5 交差点 ]
文字クラスの内部では、外部とは異なるメタ文字のセットが有効であることに注意してください。文字クラス。たとえば、正規表現。式-はメタ文字を形成する範囲になりますが、文字クラス内ではその特別な意味を失います。
行末記号
行末記号は、入力文字シーケンスの行の終わりを示す1文字または2文字のシーケンスです。以下は行末記号として認識されます。
UNIX_LINES
モードがアクティブになっている場合、認識される行末記号は改行文字のみです。
正規表現。 DOTALL
フラグが指定されていない限り、行末記号以外のすべての文字に一致します。
デフォルトでは、正規表現^と$は行末記号を無視し、入力シーケンス全体の最初と最後でのみ一致します。 MULTILINE
モードがアクティブになっている場合、^は入力の開始時と、入力の終了時を除く任意の行末記号の後に一致します。 MULTILINE
モードの場合、$は行末記号または入力シーケンスの終わりの直前に一致します。
グループとキャプチャ
グループ番号
キャプチャグループは、左から右に開き括弧を数えることによって番号が付けられます。たとえば、式((A)(B(C)))には、次の4つのグループがあります。
1 ((A)(B(C)))
2 (A)
3 (B(C))
4 (C)
グループ0は、常に式全体を表します。
キャプチャグループは、一致中に、そのようなグループに一致する入力シーケンスの各サブシーケンスが保存されるため、そのように名前が付けられています。キャプチャされたサブシーケンスは、バックリファレンスを介して式の後半で使用できます。また、一致操作が完了すると、マッチャーから取得することもできます。
グループ名
キャプチャグループには、名前付きキャプチャグループである「名前」を割り当て、後で「名前」によって逆参照することもできます。グループ名は以下の文字で構成されています。最初の文字は文字でなければなりません。
名前付きキャプチャグループには、グループ番号で説明されているように番号が付けられます。
グループに関連付けられたキャプチャされた入力は、常に、グループが最後に一致したサブシーケンスです。定量化のためにグループが2回目に評価された場合、2回目の評価が失敗した場合でも、以前に取得された値があれば保持されます。たとえば、文字列「aba」を式(a(b)?)+と照合すると、グループ2は「b」に設定されたままになります。キャプチャされたすべての入力は、各一致の開始時に破棄されます。
(?で始まるグループは、テキストをキャプチャせず、グループの合計にカウントされない純粋な非キャプチャグループ、または名前付きキャプチャグループのいずれかです。
Unicodeサポート
このクラスは、Unicode技術標準#18のレベル1に準拠しています:Unicode正規表現、およびRL2.1正規表現。
Javaソースコードの\ u2014などのUnicodeエスケープシーケンスJava™言語仕様のセクション3.3で説明されているように処理されます。このようなエスケープシーケンスは、正規表現パーサーによって直接実装されるため、ファイルまたはキーボードから読み取られる式でUnicodeエスケープを使用できます。 \ u2014 “と” \\ u2014 “は等しくありませんが、同じパターンにコンパイルされます。これは、16進値0x2014の文字と一致します。
Unicode文字は、を使用して正規表現で表すこともできます。構成\ x {…}で説明されているように、その16進表記(16進コードポイント値)たとえば、サロゲートペア\ uD840 \ uDD1Fの2つの連続するUnicodeエスケープシーケンスの代わりに、補助文字U + 2011Fを\ x {2011F}として指定できます。
Unicodeスクリプト、ブロック、カテゴリ、およびバイナリプロパティは、Perlの場合と同様に\ pおよび\ P構文で記述されます。 \ p {prop}は、入力にプロパティpropがある場合は一致しますが、\ P {prop}は、入力にそのプロパティがある場合は一致しません。
スクリプト、ブロック、カテゴリ、およびバイナリプロパティは、文字クラスの内部と外部の両方で使用できます。
スクリプトは、IsHiragana
のようにプレフィックスIs
を付けるか、iv id =を使用して指定します。 script=Hiragana
またはsc=Hiragana
キーワード(またはその短縮形sc
) 。
Pattern
でサポートされているスクリプト名は、UnicodeScript.forName
で受け入れられ定義されている有効なスクリプト名です。
ブロックは、InMongolian
のように、またはキーワードiv id =を使用して、プレフィックスIn
で指定されます。 block=Mongolian
またはblk=Mongolian
(またはその短縮形blk
) / div>。
Pattern
でサポートされているブロック名は、UnicodeBlock.forName
で受け入れられ定義されている有効なブロック名です。
カテゴリはオプションのプレフィックスIs
で指定できます:\p{L}
と\p{IsL}
はUnicode文字のカテゴリを示します。スクリプトやブロックと同様に、カテゴリは、iv idのように、キーワードgeneral_category
(またはその短縮形gc
)を使用して指定することもできます。 = “b74c30a440”> またはgc=Lu
。
サポートされているカテゴリは、Character
クラスで指定されたバージョンのUnicode標準のカテゴリです。カテゴリ名は、規範的および有益な両方の、規格で定義されているものです。
バイナリプロパティは、IsAlphabetic
のように、プレフィックスIs
で指定されます。Pattern
でサポートされているバイナリプロパティは
- アルファベット順
- イデオグラフィック
- 文字
- 小文字
- 大文字
- タイトルケース
- 句読点
- コントロール
- White_Space
- 数字
- Hex_Digit
- Noncharacter_Code_Point
- 割り当て済み
事前定義された文字クラスとPOSIX文字クラスは、次の推奨事項に準拠しています。付録C:UNICODE_CHARACTER_CLASS
フラグが指定されている場合のUnicode正規表現の互換性プロパティ。
java.lang.Characterブールismethodnameメソッドのように動作するカテゴリ(非推奨のメソッドを除く)は、指定されたプロパティの名前がjavamethodnameである同じ\ p {prop}構文を介して使用できます。
Perl5との比較
Pattern
エンジンは、Perl 5で発生するように、順序付けられた交互で従来のNFAベースのマッチングを実行します。
このクラスでサポートされていないPerlコンストラクト:
このクラスでサポートされているがPerlではサポートされていないコンストラクト:
-
説明されている文字クラスの結合と交差上記。
Perlとの顕著な違い:
-
Perlでは、\ 1から\ 9は常に後方参照として解釈されます。 9より大きい円記号でエスケープされた数値は、少なくともその数の部分式が存在する場合は逆参照として扱われます。それ以外の場合は、可能であれば8進数のエスケープとして解釈されます。このクラスでは、8進数のエスケープは常にゼロで始まる必要があります。このクラスでは、\ 1から\ 9は常に逆参照として解釈され、正規表現のその時点で少なくともその数の部分式が存在する場合は、より大きな数が逆参照として受け入れられます。それ以外の場合、パーサーはその数まで数字をドロップします。が既存のグループ数以下であるか、1桁です。
-
Perlはgフラグを使用して、最後の一致が中断したところから再開する一致を要求します。この機能は、
Matcher
クラスによって暗黙的に提供されます。find
メソッドを繰り返し呼び出すと、マッチャーがない限り、最後の一致が中断したところから再開されます。リセットされます。 -
Perlでは、式の最上位に埋め込まれたフラグが式全体に影響します。このクラスでは、埋め込みフラグは、トップレベルにあるかグループ内にあるかに関係なく、常に表示された時点で有効になります。後者の場合、フラグはPerlの場合と同様にグループの最後に復元されます。
正規表現構造の動作のより正確な説明については、Mastering Regular Expressions、3nd Edition、Jeffrey EF Friedl、O “Reilly and Associates、2006を参照してください。