正規表現
最近正規表現を扱うことがあったのでメモ書き。
基本的なものは身についているのですが、ちょっと難しくなると思い出せなくなるのでここに残しておこうかと。
目次
正規表現におけるメタ文字
基本的なことですが、メタ文字とは正規表現において「」、「?」、「.」、「$」など特別な意味を持つ文字のこと。
例えば「メタ文字」という文字列があった時にこれは「メタ文字」という検索ワードで検索してもヒットしない。
「」が「前の文字の繰り返し」という意味を持つからです。
メタ文字に含まれる文字を検索する場合はエスケープをしてあげる必要があります。
「メタ*文字」という具合に。ただし、いずれかの文字を検索する[・・・]には普通の文字として認識されるのを注意しておきたいですね。
[...]いずれかの文字パターン
検索文字を「[]」で括ると中のいずれかの文字にヒットするという検索になる。
グルーピングの「()」と間違えやすいので注意したいですね。
[ABC]
であればAかBかCのいずれかがあればヒットする。
ここで良く使うのはアルファベットかどうか、数字かどうかなどでしょうか。
例:アルファベットをヒットさせたい時
[A-Za-z]
大文字と小文字を両方ヒットさせたい場合。片方であれば大文字や小文字だけ書けばOK。
例:数字をヒットさせたい時
[0-9]
もしくは[\d]
[\d]の方がスマートで好きです。
逆に~以外と否定の意味を持たせたい時は[^A-Z]
と付ければ良い。
(...)グルーピング
「()」で括った文字の塊が含まれているかで検索してくれる。
例:ABCという文字列のグループで検索したい時
(ABC)
ただこれだと普通に「ABC」と検索し時と変わらなくね?と思った方もいるかもしれないです。
はい、このパターンだと変わらないです。
グルーピングが力を発揮するのはメタ文字と組み合わせです。
例:西暦もしくは和暦での年をヒットさせたい時(和暦名は仮で英数字以外とする)
(\d{4}|[^\w]{2}\d{1,2})年
{n}は直前のパターンの繰り返しなので、数字4桁か○○n年をヒットさせるようにしています。
一番使用するのはOR条件を表す「|」かなと思います。
(?=...)、(?<=...)後読み、先読み
始めはこれ全然理解できなかったんですが、ようは「検索条件としては入れたいけど、ヒットする文字には含めたくない」というケースで使用するようです。
後に~がついている、先に~がついている○○○を検索したいというような形で使います。
例:後にDEFがついているABCを検索したい時
ABC(?=DEF)
この時「ABCDEFGABC」という文字列があった場合、ヒットするのは初めの「ABC」だけになります。
否定の場合は(?!)
とつける。
例:先にEFGがついているABCを検索したい時
(?<=EFG)ABC
この時「ABCDEFGABC」という文字列があった場合、ヒットするのは最後の「ABC」だけになります。
否定の場合は(?<!)
とつける。
この後読み、先読みはよくHTMLタグ内の文字をヒットさせる時などに使われますね。
例:h1タグ内のテキストを取得したい時
(?<=<h1>).*(?=</h1>)
<h1\>h1のテキストだよ</h1>
というケースの場合「h1のテキストだよ」が抜き出されます。
正規表現との戦いは続く
ここに書いたことはごくごく少数のパターンでしかありません。
自分自身が忘れそうなやつだけ書いておきましたが、私もよく分からなくなるのでやっぱり調べながら作っています。
正規表現で調べると沢山まとめてくださっているサイトがありますので分からなくなった時はぜひ皆さんも調べてみてください。
なお、作った正規表現が合っているかを確認するのによく以下のサイトを使用させて頂いています。
よろしければご参照ください。