正規表現は、どなたでも簡単なものは使えると思うのですが、やはり「先読み/後読み」をマスターしない限り、次のステップには進めません。
このページでは、初心者が速攻で「正規表現の先読み」をマスターするためコツを公開します。
正規表現の先読みで何ができる?
正規表現の中で「ある位置から続く文字列に着目し、ある部分式にマッチするならば、その位置にマッチする」ものを先読みと呼んでいます。
実はただの式に過ぎないので、文字で説明しようとすると上のような回りくどいものになってしまいます。普通は余計にわかりにくくなったはずですね。
そのまま読み進めてください、すぐに理解できますよ。
実は、ただの式の一部、アンカーの一種ということになります。
アンカーとは何か?
アンカーの一般的な説明は、目印になる「幅0の文字列にマッチするメタ文字列」ということになります。
^ | 行の頭にマッチ |
$ | 行の最後にマッチ |
\A | 文字列の先頭にマッチ |
\z | 文字列の末尾にマッチ |
上のアンカー(目印)はマッチはしていますが、文字そのものにマッチしているわけではありません。
つまり、幅0の文字列と表現しているわけです。
目印でしかないので、後から文字として再利用はできません。例えば「\A」(文字列の先頭にマッチ)としてマッチしたからといって、それを再利用したら、いつも「文字列の先頭」として置き換えられるわけではありません。
記述法 | 内容 |
(?=表現) | 直後に表現がある |
この基本形だけマスターすれば、後は変化形に過ぎないのでどうにでもなります。
また、この基本形は「^表現」の「行頭の表現」と同じ仲間です。
「(?ある・ないを指示何が)」
記述法 | どこにある・ない |
= | 直後にある |
! | 直後にない |
<= | 直前にある |
<! | 直後にない |
要するに、デフォルトは「直後」に歩かないかを検査するので、指示は不要。
「直前」に歩かないかを検査したいときは「<」をつける。
「ある」ことを検査したいときは「=」、
「ない」ことを検査したいときは「!」です。
「(?」と「)」の間で指示する記号は「=」、「!」、「<=」、「<!」の4パターンしかありません。
プログラマーを惑わせるのは、後の2つ(「<=」と「<!」)です。もよく見かける「!=」などと順序を間違えてしまい、しばらく気づかないことがあります。
「後か先かを」まずはっきりさせて、次に「ある」か「ない」を指定するという順番を覚えておくのがポイントです。
具体例でチェック
regexp
(?<=焼)鶏肉(?!定食)
直前に「焼」があり直後に「定食」がない「鶏肉」にマッチ
regexp
(?<!焼)鶏肉(?=定食)
直前に「焼」がなくて、直後に「定食」がある「鶏肉」にマッチ
何が便利かチェック
例えば、住所を置換するような場合、日本全国にある「元町」を置換するケースを考えます。
埼玉県さいたま市浦和区元町の「元町」だけにマッチさせたい場合は、
regexp
(?<=浦和区)元町
とやります。この場合は、東京都大島町元町や、愛知県豊田市元町、大阪府大阪市浪速区元町の「元町」にはマッチしません。