基礎2 : 正規表現

Pocket

基本的な正規表現の覚書(その2)です。

正規表現の主要なメタ文字をまとめています。

正規表現の主要なメタ文字

[](文字クラス:character class)

その場所に存在しても良い文字の集合を表す。文字クラスは対象文字集合内の一文字にのみマッチする。

文字クラスの中では先頭の^、先頭以外の-、char(tやn)以外はメタ文字ではない。つまり文字クラス内の「?」,「*」,「+」,「.」,「(」,「)」などは単なるリテラルである。よって文字クラス内では量指定?,*,+,{min,max}やグループ化はできない※1

※1:文字クラスはクラス内の一文字とマッチする性質上、量指定やグループ化をする機能は必要なく(出来ない)量指定子に文字クラス内でメタ文字としての機能がないのは当然である。

[^](否定の文字クラス)

[^a]の場合a以外のあらゆる文字(当然空白文字も含む)のなかの一文字にマッチする。

-(ダッシュ)

文字クラス外 => リテラル
(否定)文字クラス内の先頭「[-abc]」,「[^-abc]」=> リテラル
(否定)文字クラス内の先頭以外「[a-z]」,「[^a-z]」=> 文字クラスの範囲を表すメタ文字

^(キャレット)

文字クラス外 => 文字列の先頭を表すメタ文字
文字クラス内の先頭 => 否定文字クラスを表すメタ文字
文字クラス内の先頭以外 => リテラル

.(ドット)

任意の1文字(空白文字なども含む)
※通常「.」は改行にはマッチしない。Perlのs修飾子を使うと改行にもマッチする。s修飾子を『ドット全文字マッチモード』と呼ぶ。

SunのJava正規表現パッケージなど、Unicode対応システムでは、ドットが通常マッチしないものに、Unicodeの1文字の行終端子も含めるように拡張されていることがある。

多くのツールでは「.」はヌルにマッチする。

?(クエスチョン)

?は直前の文字がオプションであることを表す(つまり0回または1回の繰り返し)。
colou?r ⇒ 「c」「o」「l」「o」「u?」「r」に分解され「u?」は常にマッチに成功する。

*(アスタリスク)

直前の文字の0回以上の繰返し。

+(プラス)

直前の文字の1回以上の繰返し。

{min,max}

可能な限りmaxまでマッチしようとし、駄目な場合はminまででよい。
{N}は正確にN回の繰返し

??,*?,+?や?+,*+,++は量指定子の説明を参照

|(選択)

選択は正規正規表現で優先順位が非常に低い。
「this and|or that」は「(this and)|(or that)」の意味であり「this (and|or) that」ではないことに注意する。

()丸括弧

(1)選択領域の制限 ⇒ 「Jeff(rey|ery)」
2)量指定子の対象をグループ化 ⇒ 「([0-9]{3})*」
3)キャプチャ用(backreference)※1 ⇒ 正規表現内で、1,2,…,nで参照できる。

※1:丸括弧()をキャプチャなしで使うには、「(?:)」キャプチャなしの丸括弧を使う。

¥b

文字クラスの外 => 語頭及び語尾を表すメタ文字
文字クラス内 => バックスペースを表すメタ文字

¥n(改行)

大半のプラットフォーム(UNIX,DOS,Windows)では通常、ASCIIの文字にマッピング。MACでは通常ASCIIの文字にマッピング。Java及び.NETサポート言語では常に、プラットフォームに関係なくにマッピング。

¥d

一般に「[0-9]」と同じ。一部のUnicode対応ツールでは、Unicodeにおけるすべての数字を表す。秀丸非対応。

¥D

一般に「[^¥d]」と同じ。秀丸非対応。

¥w(単語構成文字)

おおむね「[a-zA-Z0-9_]」と同じ。ツールによっては、アンダースコア(_)を含まないこともあればそのロケール内のすべての英数字を含むこともある。Unicodeがサポートされている場合は、通常すべての英数字を意味する。空白文字にはマッチしない。秀丸非対応。

¥W(非単語文字)

一般に「[^¥w]」と同じ。秀丸非対応。

¥s(空白文字)

ASCIIを利用するツールでは「[ ¥n¥r¥t]」と同じ。
改行nにもマッチすることに注意する。
Unicode対応ツールでは、Unicodeの「改行」制御文字U+0085、及び空白文字プロパティ「p{Z}」を含むことがある。秀丸非対応。

¥S(非空白文字)

「[^s]」と同じ。秀丸非対応。

前後読み

  • 肯定の戻り読み 「(?<=・・・)」 左側にマッチする部分が存在する
  • 否定の戻り読み 「(?<!・・・)」 左側にマッチする部分が存在しない
  • 肯定の先読み 「(?=・・・)」 右側にマッチする部分が存在する
  • 否定の先読み 「(?!・・・)」 右側にマッチする部分が存在しない

前後読みは、部分パターンがマッチするかどうかを確認するためにマッチ操作を実行はするが、実際にマッチ処理を進めることはない。

対象文字列 正規表現 マッチ マッチ後の位置
abc def 「(?=abc)」 対象文字列の最初 ▲abc def
abc def 「abc」 abc abc▲ def

※前後読み内では量子指定子?,*,+,{min,max}やグループ化(),選択|などがメタ文字として機能する。

モード修飾子

文字 モード
i 大文字と小文字を無視するマッチモード
x 正規表現に空白とコメントを自由に挿入できるモード
m 改良版行マッチモード
s ドット全文字マッチモード

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。