いろんな文字列を簡単に表すために、「正規表現」という手法があります。正規表現を知ってくと、「文字を探す系」や「文字を置換する系」の仕事が格段に速くなります。
基本的なことを以下にまとめたので、これでみなさんも今からすぐに使えます!
Contents
正規表現とは
正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである(Wikipediaさんより)。
簡単に言うと、いろんな文字の組み合わせを、1種類のパターンで表示させる方法です。例えば、「りんご」も「みかん」も「扇風機」も、すべて「\S+」で表せます。
※以下、分かりやすさのために記号を全角文字で書いてある箇所がありますが、正規表現で使う記号は、すべて半角文字で記載します。
正規表現の注意点
以下、正規表現の特徴である「特殊文字」の説明をしますが、正規表現は「特殊文字以外は使えない」ということはありません。特殊文字と普通の文字を合わせて使用します(僕は最初勘違いしてました…)
よく使う特殊文字(メタ文字)一覧
まずは「特殊文字(もしくはメタ文字)」を覚えましょう。特殊文字とは、正規表現において「何らかの意味がある」文字のことです。本来持っている意味のほかに、以下のような意味を持ちます。
(覚えましょう、と書きましたが、覚えなくていいです。必要になったらこのページに戻ってきてください。ブラウザのブックマーク機能もしくは、記事の最後にはてなブックマークアイコンがあるので使ってください)
特殊文字 | 意味 | 単独で使えるか、ほかの文字と組み合わせて使うか |
\ | 円マークの後ろに文字を組み合わせて、いろんな意味を持たせることができます。 環境によって、「バックスラッシュ」か「¥マーク」で表します。 ※日本語入力のPCにおいては、「¥」と「\」は全く同じ意味です。 | 組み合わせる |
. | 「なんでもいいから1文字」を表します。 | 単独で使える |
^ | 「行の先頭」を表します。もしくは、[]と組み合わせて否定の意味を持たせることができます。否定の意味は後で説明します。 | 単独で使える |
$ | 「行の末尾」を表します。 | 単独で使える |
[] | 「文字集合」を表します。文字集合については後で説明します。 | 組み合わせる |
* | 「前の文字を0回以上繰り返す」という意味です。 | 組み合わせる |
+ | 「前の文字を1回以上繰り返す」という意味です。 *との違いは、0回以上か1回以上かの違いです。 | 組み合わせる |
? | 「前の文字を、0回もしくは1回繰り返す」という意味です。 0か1です。2以上はありません。 | 組み合わせる |
| | 「または(or)」を表します。使い方は後で。 | 組み合わせる |
() | 2つの意味があります。使い方は後で。
| 組み合わせる |
{} | 前の文字を指定回数繰り返したいときに使います。使い方は後で。 | 組み合わせる |
本来の意味で使う「エスケープ」
文字をそのまま使いたい場合は、その文字の前に「¥(もしくは\)」を書きます。これを「エスケープ」といいます。
正規表現で足し算の「+」を表現しようとして、「+」1文字だけ書いても、前の文字を1文字以上繰り返すとみなされてしまいます。そこで「+」記号そのものを表したいときは、「\+」と書きます。
特殊文字を使った、正規表現の表し方の例
まずは、正規表現における「特殊文字」の説明です。
任意の1文字を表す
先ほど登場した文字の一部も、以下の表に掲載しています。
特殊文字 | 意味 |
\d | 「数字1文字」を表します。 |
\D | 「数字でない1文字」を表します。 |
\s | 「区切り文字」を表します。区切り文字とは、スペース、タブ、改行などです。 |
\S | 「区切り文字でない1文字」を表します。 |
\w | 「数字1文字、アルファベット1文字(大文字・小文字)、アンダーバー1文字」を表します。 |
\W | 「数字でもアルファベットでもアンダーバーでもないどれか1文字」を表します。 |
\t | 「タブ」を表します。 |
\r\n | 「改行」を表します。 ※改行には、\r、\n、\r\nの3種類ありますが、Wordで普通にEnterを押して改行すると\r\nになるので、代表してこれだけ挙げました。 |
. | 「なんでもいいから1文字」を表します(ただし改行文字は除く)。 |
^ | 「行の先頭」を表します。 |
$ | 「行の末尾」を表します。 |
正規表現の例と失敗例(基本編)
- 文章から郵便番号を探したい場合
すべてXXX-XXXXという形式で書かれているなら、「\d\d\d-\d\d\d\d」でOKです。
意味はそのまんまで、「数字1つ×3」+「ハイフン」+「数字1つ×4」です。
ただし、「\d{3}-\d{4}」と書くほうが簡単です。意味は後ほど。
- 文章から電話番号を探したい場合
03-XXXX-XXXXや、090-XXXX-XXXXというハイフンありの形式で書かれているなら、
「0\d+-\d+-\d」で、ほとんどの場合はOKです(欠点は、電話番号以外の番号も0から始まるハイフンありのものがあれば引っかかってしまう、ということです)。
意味は、「0」+「数字1つ以上」+「ハイフン」+「数字1つ以上」+「ハイフン」+「数字1つ以上」です。
ちなみに、日本の電話番号はすべて0から始まります。
- 失敗例:文章から県名を探したい場合
「\S+県」だとうまく行きません。なぜなら、例えば「お聞きいただいたのは、神奈川県・恋するうさぎちゃんさんリクエスト」という文章があった場合、「\S+県」と指定すると、「お聞きいただいたのは、神奈川県」までヒットしてしまいます。「(\S{2}|神奈川|和歌山|鹿児島)県」と書けばうまくいきますが、説明は後ほど。
3種類の括弧と「|(パイプ)」の使い方
では、次に応用編として、括弧の使い方を紹介したいと思います。
[](文字集合)
鉤括弧の中に書いてある、どれか1文字を表すことができます。例えば、[abc]と書いてあれば、「aかbかcの中から、どれか1文字」を表します。
また、先頭に「^」をつけることで、「中身の文字以外」という意味を持たせることができます。例えば、[^abc]と書いてあれば、「aかbかc以外の中から、どれか1文字」を表します。
アルファベットの大文字だけすべて、小文字だけすべて、数字だけすべてを表したい場合には、それぞれ[A-Z]、[a-z]、[0-9]と書くこともできます。
なお、括弧の先頭以外に「^」が書いてあったら、「^」そのものを表します。
文字集合の例
浦和駅、東浦和駅、南浦和駅、西浦和駅、北浦和駅を探したい場合は、「[東西南北]*浦和駅」とするとうまくいきます。
()(グループ化)
文字を()でくくると、くくった文字を1文字として扱うことができます。
グループ化の例
某サファリパークの「ほんとにほんとにほんとにほんとにライオンだ」は、「(ほんとに)+ライオンだ」と表せます。
先ほどの文字集合と組み合わせると、「浦和」の名の付く駅はすべて網羅できます。「[東西南北中(武蔵)]*浦和(美園)*駅」で、浦和駅、東浦和駅、南浦和駅、西浦和駅、北浦和駅、中浦和駅、武蔵浦和駅、浦和美園駅すべてヒットします。
なお、丸括弧には「正規表現を記憶する」という意味もありますが、これの使い方は以下の「日付の形式を変える」で解説しております。
{}(指定回数繰り返す)
最後に、中括弧の説明です。中括弧は、「直前の文字を指定回数繰り返す」という意味があります。
- a{2}:aを2回繰り返し
- a{2,}:aを2回以上繰り返し
- a{2,5}:aを2回以上、5回以下繰り返し
繰り返しの例
先ほどの基本編の郵便番号を例にします。
「\d{3}-\d{4}」は「数字1文字を3回繰り返し」+「ハイフン」+「数字1文字を4回繰り返し」です。
すべて組み合わせた例
先ほどの県名を例にします。県名は、神奈川、和歌山、鹿児島のみ3文字で、ほかは2文字です。
「(\S{2}|神奈川|和歌山|鹿児島)県」で、ほとんど可能です。
「文字1文字を2回繰り返しまたは神奈川または和歌山または鹿児島」+「県」です。グループ化によって、神奈川、和歌山、鹿児島は1文字として扱っています。
欠点は、「本日の天気は、各県とも晴れです」のような文章のときに、「、各県」とヒットしてしまうことでしょうか…完璧にやるなら、グループ化とパイプで全県1つずつやるしかないですね…
ちなみに、括弧は入れ子にすることもできます。以下のようにすると、都道府県すべて探せます。
((\S{2}|神奈川|和歌山|鹿児島)県|東京都|(大阪|京都)府|北海道)
※説明は割愛します…
正規表現は、いろんな環境で使うことができるので、覚えておくと便利です。サクラエディタにも正規表現の機能が備わっており、マスターするといろんな仕事が楽になるので、ぜひ覚えてみてください。