バックスラッシュ (\
) と組み合わせて、特別な意味を与えられた文字列をメタ文字列と呼びます。たとえば\<
、\>
などがあります。
メタ文字 | 説明 | 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 |
[…]
文字クラスとは複数の文字を[]で囲んだもので、そこに含まれているどれか1文字にマッチします。
文字クラスの内と外ではメタ文字の意味はまったく異なり、文字クラス内ではほとんどのメタ文字は一般の文字として扱われます。
メタ文字 | 文字クラス内での意味 |
---|---|
] |
文字クラスの末尾 |
- |
文字の範囲 (文字クラスの先頭以外で使用された場合のみ) |
\ |
メタ文字のエスケープ |
[^…]
否定文字クラスとは、リストに含まれていない文字にマッチする文字クラスです。たとえば[^12]
という正規表現は、"1234"という文字列の"3"にマッチします。
リストに含まれている文字にマッチしないのではなく、リストに含まれていない文字にマッチします。
文字のリストではなく文字列を含まない場合にマッチさせるならば、先読みで実現できます。
\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] |
空白文字以外 |
表からもわかるように、大文字で表現されるメタ文字は、小文字のそれを否定する文字にマッチするようになっています。
これらは文字クラスの略記法であり、文字の略記法とは異なります。
メタ文字 | マッチする回数 | |
---|---|---|
最小 | マッチをくり返す上限 | |
? |
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}
とします。
正規表現を特定の位置にマッチさせます。
対象 | 位置 | メタ文字 |
---|---|---|
文字列 | 先頭 | ^ |
末尾 | $ |
|
単語 | 先頭 | \< |
末尾 | \> |
|
単語境界 (word boundary) | 単語境界 | \b |
単語境界以外 | \B |
タイプ | 成立条件 | メタ文字 | |
---|---|---|---|
後読み (lookbehind)※1 | 肯定の後読み | 左側に…が存在する | (?<=…) |
否定の後読み | 左側に…が存在しない | (?<!…) |
|
先読み (lookahead) | 肯定の先読み | 右側に…が存在する | (?=…) |
否定の先読み | 右側に…が存在しない | (?!…) |
※1 JavaScriptなど一部の環境では、後読みは使えません。
後読み (左側)「?< 」 |
先読み (右側)「? 」 |
|
---|---|---|
肯定 「= 」 |
(?<=…) |
(?=…) |
否定 「! 」 |
(?<!…) |
(?!…) |
たとえば特定の文字列を含まない行にマッチするには、
^(?!.*str)
とします。これは「任意の文字列 + str」という文字列が、行頭の右側に存在しないことを意味し、結果としてstrという文字列を含まない行の先頭にマッチします。
これを応用すれば、特定の文字列が後に続かない文字列にマッチさせるには、
foo(?!.*str)
とすれば良いことがわかります。これは、strという文字列が後に続かないfooにマッチします。
先後読みは位置を見つけるだけです。テキストを消費しないため、置換の対象から外せます。
対象のテキスト | 正規表現 | 置換結果 | ||
---|---|---|---|---|
"zaaz" | 後読み (左側) |
肯定 | s/(?<=a)[a-z]+/A/ |
zaA |
否定 | s/(?<!a)[a-z]+/A/ |
A |
||
先読み | 肯定 | s/(?=a)[a-z]+/A/ |
zA |
|
否定 | s/(?!a)[a-z]+/A/ |
A |
||
"aaza" | 後読み (左側) |
肯定 | s/(?<=a)[a-z]+/A/ |
aA |
否定 | s/(?<!a)[a-z]+/A/ |
A |
||
先読み | 肯定 | s/(?=a)[a-z]+/A/ |
A |
|
否定 | s/(?!a)[a-z]+/A/ |
aaA |
先後読みは位置を見つけるだけのため、一致した時点で位置が進みません。
テキスト | 正規表現 | 結果 |
---|---|---|
"ababaaba" | s/a(?=a)ab/A/ |
ababAa |
|
選択肢の範囲を狭めるにはかっこを使用して、(foo|bar)
のようにグループ化します。
(…)
かっこは、それで囲んだ部分正規表現を覚えます。これをキャプチャと呼び、キャプチャしたテキストには\1
や\2
で後から参照 (後方参照) できます。
たとえば同じ文字の連続には、(.)\1
でマッチします。これは(.)
が任意の文字にマッチしてキャプチャし、そして\1
が1番目の部分正規表現と同じ文字を表すことで、同じ文字の連続を表すことになります。
なお、かっこは
の3つの機能を持ちます。
(?:…)
後方参照が不要ならば(?:…)
とすることで、要素をひとまとめに (グループ化) することができます。