正規表現について普段よく使うものは頭に入っていますが、少し違ったことをしようとすると「あれ?」となります。そんな自分向けのメモです。
正規表現って?
他人に説明する時には「文字列検索する時のパターンマッチの書き方だよ」と言ってますが、正規表現って正確には何だろう、、、と。
英語ではRegular Expressionsですね。「正規表現」って堅い言い方だとこちらも構えちゃいますが、ゆるく和訳すると「文字列の規則性を表現する方法」ってところでしょうか。
どんな時に使うの?
主にプログラミングで入力されたデータの検査(パターンマッチ)をする場合などに使います。
あとはWEBサーバ(Apacheとか)の設定で「指定のIPアドレスだけアクセス許可したい」とか「/xxx にアクセスが来たら /zzz に飛ばしたい」などででしょうか。
また、ログファイル等のテキストデータに対して、例えば「0〜9までの数字」を検索したい、と言った場合、正規表現で「[0-9]」と検索すればパッと検索できます。
正規表現を使わない場合、0で検索して、1で検索して、、、、10で検索して、と繰り返し検索をする必要が出てきます。(やってられません)
HTMLから<A>タグのリンクを丸ごと抽出する、とかも正規表現でパッとできるようになります。
どーやって書くの?
個人的によく使うもの(と忘れがちなもの)を以下にまとめます。
記号 | 説明 | 例 | マッチする文字 |
^ | 行の先頭 | ^2018 | “2018-10-28 〜” |
$ | 行の末尾 | finish.$ | “〜finish.” |
. | 改行を除く任意の文字(ワイルドカード) | /a.c/ | “abc“ |
+ | 直前の1文字が1回以上繰り返し | abc+ | “abc“とか“abccc” |
* | 直前の1文字が0回以上繰り返し | abc* | “abccc“とか”ab“ |
? | 直前の文字が0個または1個 | abc? | “abc“とか”ab“ |
\ | 次の文字を単純に文字として扱う(エスケープ) | \* | “a*b” |
[ ] | カッコ内の1文字 | [0-9] | “abc1“ |
[^ ] | カッコ内の1文字以外 | [^0-9] | “a1“ |
( ) | パターンをグループ化 | (abc)* | “abcabc“ |
{n} | 直前の文字が n 回出現するもの | x{3} | “xxxyz“ |
{m,n} | 直前の文字が n 回以上、m 回以下出現するもの | x{1,4} | “xxxx“ |
| | 直前、直後いずれか | a|b | “abc” |
\n | 改行(LF) | ー | ー |
\r | 改行(CR) | ー | ー |
\t | タブ | ー | ー |
\s | 空白文字(半角スペース、\t、\n、\r) | ー | ー |
\d | 数字([0-9]と同じ) | ー | ー |
よく使うパターン
半角数字
[0-9] |
半角英数字
[0-9a-zA-Z] |
電話番号
0\d{1,4}-\d{1,4}-\d{4} |
なかなか複雑ですが、ぼちぼち覚えていければと。。。
コメント