はじめに
一度使いこなせるようになったつもりでも、時間が経つと使い方をなかなか思い出せない「正規表現」。今回は、正規表現をまだ使ったことがない方や正規表現をいまいち使いこなせていないという方を対象に、正規表現の概要からよく使う表現のまとめまで、わかりやすく解説します。
対象読者
- 正規表現とは何かを知りたい
- 正規表現をいまいち使いこなせない
内容
- 正規表現の概要
- 正規表現の使い所
- 具体的な正規表現の使い方
正規表現とは何か
正規表現とは文字列のパターンを表現する方法のことです。正規表現を使うことで、規則性のある複数の文字列を1つの文字列で表現できるようになり、文字列に対して検索や置換などの一括処理を施す際に重宝します。 正規表現は通常の文字とメタ文字(特殊な役割を持つ文字)で構成されます。
例えば、次のような複数の文字列に対して特定の文字列を検索したい場合を考えてみます。
くろやぎくん.com
kuroyagikun.com
くろやぎくん.jp
123.com
「く」で始まる文字列である「くろやぎくん.com」と「くろやぎくん.jp」にマッチさせたい場合は、次のような正規表現を使います。
^く.*
また、「○○(数値).com」と書かれた文字列である「123.com」にマッチさせたい場合は、次のような表現です。
[0-9]+.com
このように、正規表現を使うことで特定の文字列だけを抽出できます。
いつ正規表現を使うのか
私が正規表現を実際に使ってみて便利だと感じたのは、Wordで文章を編集しているときや、テキストエディタでコードの編集をしているときです。「このパターンを持つ文字列のみ検索したい」や「あのクラス名を持つ要素だけを削除したい」という場面で大活躍しました。
正規表現の使い方
正規表現で使うメタ文字
正規表現で使うメタ文字は次の通りです。
. ^ $ [ ] * + ? | ( )
すべて半角記号です。ただ、これらの記号はメタ文字としてではなく、普通の文字としてもよく目にします。例えば、「https://www.google.co.jp/search?q=google
」の中に含まれる「.」や「?」などです。なので、正規表現を用いた検索を行う場合、この文字列を検索するときに「https://www.google.co.jp/search?q=google
」と検索してもマッチしません。なぜならば、「?」などの文字がメタ文字として扱われてしまっているからです。 では、普通の文字として扱うにはどうすればよいのでしょうか。それは、次の通りメタ文字の直前にバックスラッシュをつけます。
\. \^ \$ \[ \] \* \+ \? \| \( \) \\
メタ文字の種類
先程紹介したメタ文字が持つ意味を確認します。
任意の1文字「.」
- 正規表現
くろやぎくんは.が好き。
- マッチする文字列
くろやぎくんは黒が好き。
くろやぎくんは猫が好き。
「.(ドット)」として扱いたい場合は、次のようにバックスラッシュを直前に置きます。
- 正規表現
test\.txt
- マッチする文字列
test.txt
行頭「^」
- 正規表現
^よろし
- マッチする文字列
よろしく!
よろしくお願いします
よろしゅうござんす
行末「$」
- 正規表現
ます$
- マッチする文字列
ありがとうございます
にじます
直前の文字を0回以上繰り返し「*」
- 正規表現
ハイボール飲んでウィー*
- マッチする文字列
ハイボール飲んでウィ
ハイボール飲んでウィー
ハイボール飲んでウィーー
直前の文字を1回以上繰り返し「+」
- 正規表現
ハイボール飲んでウィー+
- マッチする文字列
ハイボール飲んでウィー
ハイボール飲んでウィーー
直前の文字を1回以下繰り返し「?」
- 正規表現
ハイボール飲んでウィー?
- マッチする文字列
ハイボール飲んでウィー
ハイボール飲んでウィ
「直前の文字を1回以下繰り返し」とは言い換えると「直前の文字を0回または1回繰り返し」という意味です。この正規表現は英単語の単数形と複数形やスペースのあるなしなどを扱うときに役に立ちます。
-
単数形複数形
- 正規表現
Beatles?
- マッチする文字列
Beatle Beatles
-
スペースのあるなし
- 正規表現
プエルト ?リコ
- マッチする文字列
プエルト リコ プエルトリコ
任意の文字の繰り返し「.*」
ここまで、1つのメタ文字で表される正規表現について見てきましたが、これらを組み合わせると、「任意の1文字を0回以上繰り返す」などの表現ができるようになります。
- 正規表現
.*たい。
- マッチする文字列
たくさんの人にブログを見てもらいたい。
ガジェット好きの人とつながりたい。
注意
この「.*」を使うときには、その適用範囲に注意が必要です。 「隣の客はよく柿食う客だ。」という文字列を例にして考えてみます。
- 正規表現
隣.*客
- 処理対象の文字列
隣の客はよく柿食う客
- マッチする文字列
×隣の客 〇隣の客はよく柿食う客
この例を見てわかるように、「.」はできるだけ長くパターンに合うものとマッチします。したがって、文末を「.」とすることで、文末まで合致するといった応用的な使い方もできるようになります。
直前の文字をn回繰り返す「{n}」
- 正規表現
[0-9]{3}-[0-9]{4}-[0-9]{4}
- マッチする文字列
090-1234-5678
この正規表現は、電話番号や郵便番号の抽出に役立ちます。
いずれかの文字列「|」
- 正規表現
くろやぎ|しろやぎ|あおやぎ|あかやぎ
- マッチする文字列
くろやぎ
しろやぎ
あおやぎ
あかやぎ
指定した文字の中のいずれかの文字や数字「[a-z]や[0-9]」
- 正規表現
[f-h]ound
- マッチする文字列
found
gound
hound
- 正規表現
1[0-9]歳になりました。
- マッチする文字列
10歳になりました。
12歳になりました。
15歳になりました。
18歳になりました。
注意
「[]」の中ではメタ文字は普通の文字として扱われます。「[.]」は「.かいずれかの文字」という意味になります。
指定した文字以外「[^]」
- 正規表現
私は[^父]が好きだ。
- マッチする文字列
私は母が好きだ。
私は弟が好きだ。
世のお父さん、悪気はないので悪しからず。
グループ化()
前述した、「直前の文字を1回以上繰り返し「+」」の例においては、以下のようなマッチング結果になりました。
- 正規表現
ハイボール飲んでウィー+
- マッチする文字列
ハイボール飲んでウィーーー
しかし、グループ化を用いることで以下のような文字列にマッチするようになります。
- 正規表現
ハイボール飲んで(ウィー)+
- マッチする文字列
ハイボール飲んでウィーウィーウィー
同様に、「いずれかの文字列「|」」の例も見てみましょう。
- 正規表現
愛|金が大事
- マッチする文字列
愛
金が大事
ここで、グループ化すると以下のようになります。
- 正規表現
(愛|金)が大事
- マッチする文字列
愛が大事
金が大事
おわりに
本記事では、正規表現の概要、よく使う表現を紹介しました。正規表現は意味のない記号の組み合わせで構成されているため、すぐに習得するのは難しいかもしれません。実践を通して何度も使うことでマスターできるようになれば、文章編集やコーディングの効率が向上するはずです。