メタ文字 / メタキャラクタ (meta character)

文字

バックスラッシュ (\) と組み合わせて、特別な意味を与えられた文字列をメタ文字列と呼びます。たとえば\<\>などがあります。

文字の略記法 (escape sequences)

メタ文字 説明 ASCII文字 8進表記
\a アラート BEL 007
\b バックスペース BS 010
\e エスケープ文字 ESC 033
\f 改ページ FF 014
\n 改行 LF 012
\r 復帰 CR 015
\t 水平タブ (通常のタブ) HT 011
\v 垂直タブ VT 013

文字クラスの略記法

文字クラス (character classes) […]

文字クラスとは複数の文字を[]で囲んだもので、そこに含まれているどれか1文字にマッチします。

文字クラスのではメタ文字の意味はまったく異なり、文字クラス内ではほとんどのメタ文字は一般の文字として扱われます。

文字クラスメタ文字
メタ文字 文字クラス内での意味
] 文字クラスの末尾
- 文字の範囲
(文字クラスの先頭以外で使用された場合のみ)
\ メタ文字のエスケープ

否定文字クラス [^…]

否定文字クラスとは、リストに含まれていない文字にマッチする文字クラスです。たとえば[^12]という正規表現は、"1234"という文字列の"3"にマッチします。

リストに含まれている文字にマッチしないのではなく、リストに含まれていない文字にマッチします。

文字のリストではなく文字列を含まない場合にマッチさせるならば、先読みで実現できます。

文字クラスの略記法 (shorthand character classes) \d, \w, \s

文字クラスを省略して表現する、文字クラスの略記法があります。これらの略記法は文字クラスを使用するところで、それの代替として使用できます。

  メタ文字 通常の表記※1 マッチする文字
数字
(Decimal digit)
\d [0-9] 数字
\D [^0-9] 数字以外
文字
(Word)
\w [a-zA-Z0-9_] 単語の一部とみなされる文字
\W [^a-zA-Z0-9_] 単語の一部ではない文字
空白
(whiteSpace)
\s [ \f\n\r\t\v] 空白文字
\S [^ \f\n\r\t\v] 空白文字以外
※1 この表記は一般的なものであり、詳細は環境により異なります。

表からもわかるように、大文字で表現されるメタ文字は、小文字のそれを否定する文字にマッチするようになっています。

これらは文字クラスの略記法であり、文字の略記法とは異なります。

量指定子 (quantifier)

メタ文字 マッチする回数
最小 マッチをくり返す上限
? 0 1
* 0 無制限
+ 1 無制限
{num} num num
{min,} min 無制限
{min,max}※1 min max

※1 範囲指定繰り返し制御 (interval quantifier) と呼ばれる形式です。

最大量指定子 絶対 最大量指定子 最小量指定子
* *+ *?
+ ++ +?
? ?+ ??
{min,max} {min,max}+ {min,max}?

数字が2か4回くり返されるときにマッチさせる場合、[0-9]{2,4}とすると3回くり返されるときにもマッチしてしまいます。このようなときには条件をグループ化し、([0-9][0-9]){1,2}とします。

ゼロ幅マッチ (位置にマッチ)

正規表現を特定の位置にマッチさせます。

対象 位置 メタ文字
文字列 先頭 ^
末尾 $
単語 先頭 \<
末尾 \>
単語境界 単語境界 \b
単語境界以外 \B

先後読み (lookahead & lookbehind)

  タイプ 成立条件 メタ文字
後読み※1 肯定の後読み 左側に…が存在する (?<=…)
否定の後読み 左側に…が存在しない (?<!…)
先読み 肯定の先読み 右側に…が存在する (?=…)
否定の先読み 右側に…が存在しない (?!…)
  • 読み」は、すでに読んだテキストのろの方 (左の方) を調べる。
  • 読み」は、まだ読んでいないテキストのの方 (右の方) を調べる。

※1 JavaScriptなど一部の環境では、後読みは使えません

メタ文字のパターン
  後読み 左側 「?< 先読み 右側 「?
肯定 「= (?<=…) (?=…)
否定 「! (?<!…) (?!…)
特定の文字列を含まない場合にマッチ

たとえば特定の文字列を含まない行にマッチするには、

^(?!.*str)

とします。これは「任意の文字列 + str」という文字列が、行頭の右側に存在しないことを意味し、結果としてstrという文字列を含まない行の先頭にマッチします。

これを応用すれば、特定の文字列が後に続かない文字列にマッチさせるには、

foo(?!.*str)

とすれば良いことがわかります。これは、strという文字列が後に続かないfooにマッチします。

置換での利用例

先後読みは位置を見つけるだけです。テキストを消費しないため、置換の対象から外せます

処理例
対象のテキスト 正規表現 置換結果
"+zaaz+" 先読み
s/(?=a)[a-z]+/A/
+zA+
s/(?!a)[a-z]+/A/
+A+
後読み
s/(?<=a)[a-z]+/A/
+zaA+
s/(?<!a)[a-z]+/A/
+A+
"+aaza+" 先読み
s/(?=a)[a-z]+/A/
+A+
s/(?!a)[a-z]+/A/
+aaA+
後読み
s/(?<=a)[a-z]+/A/
+aA+
s/(?<!a)[a-z]+/A/
+A+

グループ化、キャプチャ

選択 |

選択肢の範囲を狭めるにはかっこを使用して、(foo|bar)のようにグループ化します。

部分正規表現 (部分式)

 

グループ化 (grouping) (…)

かっこは、それで囲んだ部分正規表現を覚えます。これをキャプチャと呼び、キャプチャしたテキストには\1\2で後から参照 (後方参照) できます。

たとえば同じ文字の連続には、(.)\1でマッチします。これは(.)が任意の文字にマッチしてキャプチャし、そして\1が1番目の部分正規表現と同じ文字を表すことで、同じ文字の連続を表すことになります。

なお、かっこは

  • グループ化
  • 後方参照のためのキャプチャ機能
  • 選択範囲の限定

の3つの機能を持ちます。

キャプチャなしグループ化 (?:…)

後方参照が不要ならば(?:…)とすることで、要素をひとまとめに (グループ化) することができます。

参考

参考書