「正規表現をきちんと学ぶ気はない、でも仕事では使いたい!」とかお思いの欲張りなあなたのための記事です。
正規表現の定義
パターンとターゲットとなる文字列(以下 対象)をマッチさせます。
(ホントのところはウィキペディアとかで調べてね!)
パターンの構成
【文字+文字の数(以下 量化子)】×n
覚えるべき記号(メタ文字)
たったの 6つです。
- ^ => 対象の始まり
- $ => 対象の終わり
- . => どんな文字でもいいから、1文字
以下は量化子です。
- * => 直前の文字がいくつあっても、なくてもいい
- + => 直前の文字がいくつあってもいいけど、ないとダメ
- ? => 直前の文字はないか、1つだけ
なお、これらの文字を記号としてではなく文字としてそのまま扱いたい場合、\
でエスケープできます。
文字クラス
文字は普通にa
とかけばa
にマッチします。が、複雑なマッチをしたいときは文字クラスを使います。
-
[aiueo]
=>a
i
u
e
o
の どれかの文字 -
[^aiueo]
=>a
i
u
e
o
以外の文字 -
[0-9]
=> 数字1文字
単語単位でマッチさせたい場合
()
の中に単語を入れます。例えば、hacker
の前にsuper
が最低1つついた文字列(例えばsupersupersuperhacker
)にマッチさせたい場合、
(super)+hacker
というパターンが使えます。
また、単語は|
を使うことで「または」マッチができます。(super|great)+hacker
とすると、greatsupergreathacker
のような文字列にマッチします。
使ってみる
拡張子がrb
で、かつファイル名にpython
またはperl
が含まれているファイルだけを探したいとします。この場合、ファイル名が対象です。パターンは、
^.*(python|perl)+.*\.rb$
となります。左から読み下すと、
「対象が始まり、どんな文字列があってもなくてもよく、pythonまたはperlという文字列が最低1つはあり、どんな文字列があってもなくてもよく、.rbという文字列が1つあり、対象が終わる」
ような対象にマッチするわけです。
http://rubular.com/r/loDT0sefmq
上記URLに結果があるので確認してみてください。
まとめ
正規表現は難しい(´・ω・`)