2011年5月31日火曜日

Java正規表現

文字クラス

文字クラスは、ほかの文字クラス内に指定したり、結合演算子 (暗黙的) や交差演算子 (&&) を使用して作成することができます。結合演算子は、1 つ以上のオペランドクラスに含まれるすべての文字を含むクラスを表します。交差演算子は、2 つのオペランドクラスに含まれるすべての文字を含むクラスを表します。

文字クラス演算子は、次の順で優先順位が高くなります。

1    

リテラルエスケープ    

\x

2    

グループ化

[...]

3    

範囲

a-z

4    

結合

[a-e][i-u]

5    

交差

[a-z&&[aeiou]]

実際には、異なるメタキャラクタのセットは、文字クラスの外部ではなく内部に存在することに留意してください。たとえば、正規表現 . は、文字クラス内部ではその特殊な意味を失いますが、表現 - は範囲を示すメタキャラクタになります。

行末記号

「行末記号」とは、入力文字シーケンスの行の末尾を指定するときに使用する、1 文字または 2 文字の文字シーケンスです。次の文字が行末記号として認識されます。

  • 改行文字 ('\n')
  • 直後に改行文字が付いたキャリッジリターン文字 ("\r\n")
  • 単独のキャリッジリターン文字 ('\r')
  • 次行文字 ('\u0085')
  • 行区切り文字 ('\u2028')
  • 段落区切り文字 ('\u2029)

UNIX_LINES モードが有効な場合は、改行文字だけが行末記号として認識されます。

正規表現 . は、DOTALL フラグが指定されていない場合、行末記号以外のすべての文字とマッチします。

デフォルトでは、正規表現 ^ および $ は行末記号を無視し、入力シーケンス全体のそれぞれ先頭と末尾だけにマッチします。MULTILINE モードがアクティブになると、^ は入力の先頭、および入力の末尾を除くすべての行末記号のあとにマッチします。MULTILINE モードの場合、$ は行末記号の直前、または入力シーケンスの末尾にマッチします。

正規表現グループと先方参照

先方参照を行う正規表現グループには、左から右方向に左丸括弧を数えることによって、番号が付けられます。たとえば、表現 ((A)(B(C))) は、次の 4 つのグループに分類されます。

1    

((A)(B(C)))

2    

(A)

3    

(B(C))

4    

(C)

グループ 0 は、常に表現全体を表します。

先方参照を行う正規表現グループがこのように分類されてから、入力シーケンスの各部分シーケンスがこれらのグループとマッチされ、マッチするたびに部分シーケンスが保存されます。正規表現グループの部分シーケンスは、前方参照として表現内であとで使用できます。また、マッチ操作が完了したら、正規表現エンジンから取り出すこともできます。

グループと入力シーケンスがマッチされると、そのグループと最後にマッチした部分シーケンスが常に先方参照されます。数量子を指定した場合は、グループがもう一度評価されます。2 回目の評価が失敗した場合でも、その前に先方参照された値がある場合は、その値が保持されます。たとえば、文字列 "aba" を表現 (a(b)?)+ とマッチした場合は、グループ 2 に設定された "b" が保持されます。先方参照されたすべての入力は、各マッチが始まる前に破棄されます。

(? で始まるグループは、純粋な「先方参照されない正規表現」グループで、テキストを先方参照せず、グループ全体にカウントされません。

Perl 5 との比較

Pattern エンジンは、Perl 5 と同じく、順序付けされた代替に対する従来の NFA ベースのマッチングを実行します。

このクラスでサポートされていない Perl 構文

·         条件付き構文 (?{X}) および (?(条件)X|Y)

·         埋め込みコード構文 (?{コード}) および (??{コード})

·         埋め込みコメント構文 (?#コメント)

·         プリプロセス演算 \l \u\L\U

このクラスでサポートされているが、Perl でサポートされていない構文

·         強欲な数量子。できるだけ長い文字列とマッチする。後戻り (バックトラック) すれば正規表現全体のマッチが成功するときでも、後戻りしない

·         文字クラスの結合と交差

Perl との大きな相違点

·         Perl では、\1\9 は常に前方参照と解釈される。9 を超える数字がバックスラッシュでエスケープされているときは、対応する数の部分パターンが存在する場合、前方参照とみなされる。存在しない場合は、8 進数のエスケープ (可能な場合) とみなされる。このクラスでは、8 進数のエスケープは常にゼロで始まる。\1\9 は、常に前方参照と解釈される。それより大きい数字は、正規表現のその箇所に対応する数の部分パターンが存在する場合は、前方参照とみなされる。存在しない場合は、その数字が既存のグループ番号以下になるか、1 桁の数字になるまで、桁が減らされる

·         Perl では、最後のマッチが終了した場所からマッチの再開を要求するときは、g フラグを使用する。この機能は、Matcher クラスによって暗黙的に提供される。find メソッドを繰り返し呼び出すと、正規表現エンジンがリセットされないかぎり、最後のマッチが終了した場所からマッチ操作が再開する

·         Perl では、表現の最上位に埋め込まれたフラグが表現全体に適用される。このクラスの埋め込みフラグは、埋め込まれた場所にかかわらず、その箇所でのみ有効になる。フラグがグループ内に埋め込まれている場合は、Perl と同様にグループの最後で復元される

·         Perl では、表現 *a などの不正なマッチ構文や表現 abc] などのぶら下がり括弧を許容しており、それらをリテラルとみなす。このクラスでもぶら下がり括弧は受け入れるが、+、?、* などのぶら下がりメタキャラクタは許容せず、それらが見つかった場合は PatternSyntaxException をスローする

 

0 件のコメント:

コメントを投稿