正規表現

正規表現

正規表現とは?

文字列のパターンをコンピューターに理解できる形で表現したものです。

文字列の検索、置換、誤り検出、テキスト整形などに使用します。

正規表現概要

例えば、文字列中から「print」という文字列を検索する場合に使う正規表現は「print」となる。

これは当然のことに思えるかもしれないが、実はいつも上手くいくとは限らない。

例えば、今度は「100$」という正規表現を使って文字列を検索してみる。

「Your total is 100$」 という文にはマッチするが、

「Your total is 100$.」 という文にはマッチしない。(文末にピリオドが有る点に注意)

これは一体どういうことだろうか?

「$」が特殊な意味を持つメタ文字だということを知らなければ、この現象を理解することは出来ない。

リテラル文字

先の「print」のように、「文字通り」に検索される文字をリテラル文字(非メタ文字)と呼ぶ。

一方、リテラル文字ではない「$」のような文字は、「文字通り」の検索結果とはならない。

このように、「文字通り」の検索結果とならない文字をメタ文字と呼ぶ。

先の例に戻ると、「$」はマッチする位置を限定するメタ文字である。そのため、「100$」は文末に「100」を含むという意味になり、それ以外の場所で見つかったとしてもマッチしないのである。

メタ文字はツールの実装に依存するので、これとこれがメタ文字と明確に定義できる種類のものではないが、ある程度標準的なものは決まっている。

ここで大切なことは、メタ文字にどのようなものがあるかを知ることではなく、リテラル文字とメタ文字の2つがあり、メタ文字はエスケープ文字でその効力がなくなり、逆にリテラル文字の中にはエスケープ文字でメタ文字に生まれ変わるものが存在するというルールである。

エスケープ文字とその効力

エスケープ文字直後の文字 動作
メタ文字 効力が失われる
特定の非メタ文字 メタ文字となる
上記以外の非メタ文字 リテラル文字のまま

エスケープ

それでは、メタ文字自体を"文字通り"に検索するにはどうしたらよいのだろうか?

この目的のために使う特殊な文字をエスケープ文字と呼ぶ。そしてメタ文字の効力を打ち消すことをエスケープするという。

エスケープ文字は\(バックスラッシュ)。エスケープ文字もメタ文字の一種といえる。

これですべての文字を"文字通り"検索できるだろうか?

いや、まだいくつかの問題が残っている。

エスケープ文字自体を表す方法をまだ紹介していない。これはエスケープ文字をエスケープすること、つまりエスケープ文字を2つ並べる。

では3つ並んだ場合はどうなるのだろう?

”\\[” は何を意味するのだろう?

エスケープ文字の次にリテラル文字が続く場合、通常は何も起こらない。つまりエスケープ文字は単に無視される。次の例では単に"v"が検索される。

"\v"

この例を見れば"\a"が"a"を検索するものと思い込むのは無理もない。

ところが、特定のリテラル文字の直前にエスケープ文字が来ると、特殊な意味を持つようになる。つまりメタ文字に生まれ変わるのだ。

エスケープ文字によりメタ文字になるもの

正規表現の失敗例

メタ文字を理解せずに使用すると思わぬ失敗をする。

テストツールを使ってマッチすることをテストするが、マッチしないことはテストせずに余計なものがマッチしていることに気が付かない。

単語境界の判別(空白だけでなく、タグなどを境界と見なす必要がある場合もある)

最短一致を意図したのに最長一致してしまう

必要のないものが一致する

ソースコードを読むときに間違った記述がされていると、本来やろうとしていることを間違って解釈して読んでしまう。

特定の条件ではうまくいき、条件によってはうまくいかない。気が付かないことが多い。

文字列中のメタ文字と正規表現のメタ文字はまったく無関係(類似していることはあるが根本的は無関係)

頻出正規表現の使用例

形式が一致していることを調べる(積極的)

特定の文字を使用していないことを調べる(消極的)

 

↑このページの先頭へ