正規表現演算子
通常使用する演算子と対応表です。
特殊キャラクタ(メタキャラクタ) | |
[] | ブラケットはキャラクタクラス。ワイルドカードをより賢くしたもの。ブラケットで囲んだ文字のいずれかひとつにマッチするかをチェックします。[0-9] は数字。[a-z][A-Z] は半角英字を表す。 |
() | パーレンはパターンのグループ化を意味します。優先順位が高くなり、パーレンの中を評価した後に全体を評価します。[] の or 演算や複数の抽出などで記述するときなどに使用。([0-9]|[a-z]|[A-Z]) では半角数字または半角英字を検索する。ブラケットのようにキャラクタクラスを表すものではない。 |
^ | カレットは文字列の行頭を表すキャラクタ。または文字クラスの否定を表します。^[0-9] は半角数字からはじまる列を検索する。[^0-9] は半角数字ではない文字列を検索。 |
$ | ドル記号は文字列の行末を表すキャラクタ。[。]$ は行末に。がつくかチェック。 |
. | ピリオドは改行を除く任意のキャラクター文字を意味します。ここでいう改行とは[\r][\n]などです。カタカナひらがな漢字などの範囲の広い文字列を抽出する場合などにも使います。[.]{+} で任意の文字列を検索する。 |
* | アスタリスクは0回以上のキャラクタの繰り返しを検索します。[0-9]{*} で数字の0回以上の繰り返しを意味します。 |
+ | プラスは1回以上のキャラクタの繰り返しを検索します。[0-9]{+} で数字の1回以上の繰り返しを意味します。 |
? | 疑問符は0回または1回のキャラクタを検索します。[0-9]{?} で数字の0回または1回の繰り返しを意味します。 |
| | 論理和は OR演算と同じ意味です。([a-z]|[A-Z]) で英字半角の小文字か大文字を意味します。 |
\ | エスケープ文字は特殊文字を表現する場合につかいます。\t でタブ文字。\s は半角スペース。\n はニューライン(改行)。他にもいろいろ。 |
{n} {n,} {n,m} |
パターンのくり返し回数指定。それぞれ n回、n回以上、n回以上、m回以下になる。 |
正規表現で気をつけること
例えば、[^Microsoft]Office という正規表現では、MicrosoftではないOfficeの指定という意味ではありません。[]で囲んだものが表しているのは文字列ではなく、文字の集合です。よって、ブランケット内で否定演算をかけると文字列中のMicrosoftの1文字だけを対象に否定演算をかけてしまうことになります。
次に、[]で囲まれた範囲内ではメタキャラクタの特殊な意味は失います。したがって、[^(Microsoft)]Office という正規表現でも、MicrosoftではないOfficeの指定という意味にはなりません。この場合、文字列中の(Microsoft)の1文字だけを対象に否定演算をかけることになります。
あるパターンの文字列にマッチする正規表現というのは比較的簡単に記述することが可能ですが、ある特定の文字列を含まない文字列を指定するというのは結構大変です。Perl5互換の正規表現で抽出する場合は戻り読みという方法で抽出が可能です。Microsoftの文字列否定の場合だと、
(?<!Microsoft)Office
になりますが、これだとOpenOfficeを抽出したいのに、抽出結果は単にOfficeになってしまいます。
このように特定の文字列を含まないという表現は難しいのです。 TOP
最小マッチ(ものぐさマッチ)
正規表現にて使われる+や*は量指定子と呼ばれます。最小マッチは量指定子の直後に使用し、マッチ回数が最も少ないマッチを優先するようにします。ものぐさマッチ、控えめマッチ、欲張りでないマッチなどとも呼びます。最小マッチは ? 記号で表します。
?? | 1回または0回 |
*? | 0回以上 |
+? | 1回以上 |
{n, m}? | n回以上m回以下 |
{n, }? | n回以上 |
{, m}? | 0回以上m回以下 |
^[ab]*[bc]aabbcc
aabbaabbcc
bb
^[ab]*?[bc]aabbcc
aabbaabbcc
bb
^[ab]+[bc]aabbcc
aabbaabbcc
bb
^[ab]+?[bc]aabbcc
aabbaabbcc
bb
^[ab]?[bc]aabbcc
aabbaabbcc
bb
^[ab]??[bc]aabbcc
aabbaabbcc
bb
^[ab]{2,}[bc]aabbcc
aabbaabbcc
aabc
aaaab
bb
^[ab]{2,}?[bc]aabbcc
aabbaabbcc
aabc
aaaab
bb
^[ab]{2,4}[bc]aabbcc
aabbaabbcc
aabc
aaaab
bb
^[ab]{2,4}?[bc]aabbcc
aabbaabbcc
aabc
aaaab
bb TOP
先読み(肯定先読み)
指定した正規表現が先にあるかを見て値を返します。メタ文字は (?=) です。先読みや戻り読みは、位置にマッチするのが、理解に難しいところです。例えば、検索対象が XYZ であれば、下記の4つの位置があります。
- 行頭と文字Xの間
- 文字Xと文字Yの間
- 文字Yと文字Zの間
- 文字Zと行末の間
(?=式) | 先読み |
(?!式) | 否定先読み |
(?<=式) | 戻り読み |
(?<!式) | 否定戻り読み |
a(?=b)aababb
b(?=b)aababb
.(?=b)aababb TOP
否定先読み
指定した正規表現が先にないかを見て値を返します。メタ文字は (?!) です。
a(?!b)aababbaaa
b(?!b)aababbaaa
.(?!b)aababbaaa
a(?!.*b)aababbaaa TOP
戻り読み(肯定戻り読み)
指定した正規表現が後ろにあるかを見て値を返します。メタ文字は (?<=) です。
(?<=a)aaababbaaa
(?<=b)aaababbaaa
(?<=a)baababbaaa
(?<=[ab])aaababbaaa TOP
否定戻り読み
指定した正規表現が後ろにないかを見て値を返します。メタ文字は (?<!) です。
(?<!a)aaababbaaa
(?<!b)aaababbaaa
(?<!a)baababbaaa
(?<![ab])aaababbaaa TOP