正規表現をたった10分でマスターする方法

今日はエディタとかでよく目にする「正規表現」。
PHPを編集していてもしょっちゅう出てくるので、一度しっかり学びたかった「正規表現」。

わずか10分(と少し)で学べるマスターする方法です。
レッツゴー・ウンチキスト!

正規表現とはなにか?

自分の書いた文章をエディタなどで検索する時に、

WINDOWSとかWindowsを一気に検索したい時ってありますよね。
例えば、そんな時は

W(indows|INDOWS)

こんな感じで記載すると、全部がヒットすることになります。
ま、エディタなら大文字小文字を区別しない、というチェックボックスがあったりしますけど。笑

正規表現文字一覧「メタ文字」

正規表現で使用する特殊文字を「メタ文字」と言います。
具体的には、これらがメタ文字です。

. ^ $ [ ]  ( ) * + ? |

これらは、特殊文字扱いで、この文字はある役割を果たす機能を示し、正規表現では文字として認識されません。
それでも、これらのメタ文字を文字として認識したい時もありますよね。

メタ文字自体を、検索したい時には、その文字の前に「\」(バックスラッシュ)を入れればOKです。

つまり、「*」を検索したい時には、「\*」とすればOKです。
なお、\自体を探す時には、\\と検索します。

正規表現につかう「メタ文字」の読み方マスターしよう

さて、先ほどの

. ^ $ [ ]  ( ) * + ? |

についてですけど、まずはこの読み方を覚えましょう。

読めないものは覚えられない。まずは、読み方から。
知っているものは飛ばして行きましょう!

. ドット dot

.  は、「ドット dot」と読みます。「ピリオド」とも。
でもやっぱり、ドットの方が一般的ですね。

「.com」は「ドットコム」ですもんね。

^ ハット

この記号「^」は、「ハット」と言います。帽子を示すハット。
また、「カレット」とか、「キャレット」と言います。
英語ではcaret。
ちなみに、人参を示す「キャロット=carrot」と発音が同じです。

物書きの人たちは校正で使って「脱字記号」と言われていましたね。
「アクサンシルコンフレックス」とも言うそうです。
僕は聞いた事ないけど。

$ ドル、ドル記号、ダラー

これはさすがに読めますね。

[ ] ブラケット・大括弧

そもそも、日本語で ”[ “  や ”]” は、「大」カッコといいます。
大があるということは、中カッコ、小カッコもあるわけですね。
ちょっと先にそれを覚えてしましょう。

[] 大括弧
{} 中括弧
() 小括弧

大と、小は比較的見ますね。
中は私はあまり見ないのですが、真ん中が曲がっているので、「中」カッコと覚えるといいでしょう。

ただし、正規表現で中括弧は使いませんので、これ以上は紹介しません。

さて、大カッコにもどりましょう。

それぞれ見て行きます。

[ ブラケット、Left Square Bracket 左大括弧、大括弧開き

大カッコのうち、左側で使うのは「左大括弧」とも言うんですね。
同じものは「開き」という言い方もして、「大括弧開き」とも言います。

] ブラケット、right square bracket 右大括弧、大括弧閉じ

同様に、右側で使うので「右大括弧」「大括弧閉じ」ともいいます。
英語ではRight Square Bracketですね。
英語では形に注目していて、正方形を示す「Square」(スクエア)という言い方をすることに注目です。

() 小括弧、パーレン paren , parenthesis

私たちが一番よく使うカッコと思われるこのカッコは、「小カッコ」なんですね。

英語ではパーレンとか、パレンセシスといいます。
パレンセシスが長いので、パーレンと言うようです。

( 左小括弧、パーレン、丸括弧開き、開き括弧、括弧開き、paren、left parenthesis

) 右小括弧、パーレン、丸括弧閉じ、閉じ括弧、括弧閉じ、paren、right parenthesis

これまでと同様のルールで読みます。

* アスタリスク

Excelでは「×」の意味の記号として使う「アスタリスク」
比較的読み方も認知度高いですね。

+ プラス、正符号

「プラス」これは大丈夫ですね。「足す」でもいいみたいです。

? クエスチョンマーク、疑問符

子どもの頃、「クエスチョンマーク」という言葉を覚えた時に、少し大人になった気分になったのを覚えています。どうでもいいですけど。

「疑問符」という言い方もよく使いますよね。

|  縦線、バーティカルライン vertical line

日本語でなんて言うのかなと思いましたけど、「縦線(たてせん)」だそうです。

びっくり。英語でもそのままで「バーティカルライン」
WEB作成の人は「バーティカル」と言っている人もいました。

バーティカルバー vertical barとも言うそうです。

正規表現に使うメタ文字(特殊記号)の意味

では、早速本題の「意味」にいきましょう。

. ドット…任意の1文字を検索します

ドットは任意の1文字を示します。あくまで「1文字」です。

正規表現君の…に..
検索される
文字列の例
君のひとみ乾杯
君の放漫さ辟易

上記の場合だと、ドットの数が「君の」のあとが3個、「に」のあとに2個ですので、その個数にあったものはなんであれ検索されます。

^ ハット その1 …行頭にあるものを検索します

正規表現^気持ちいい
検索される
文字列
文頭が「気持ちがいい」
で始まる文章のみ
  • 気持ちいい朝
  • 彼女の気持ちいい返事
  • スイミングは気持ちいい

上記3つのあるファイルで検索をかけると「気持ちいい朝」のみが検索されます。

^ ハット その2… 〜を除くものを検索します

左大括弧[の次にハットが来た場合、「except」の意味になります。
後でも解説しますけど、一応書いておきます。

正規表現PP[^A-Z]P
検索される
文字列
PP0P PP3P PP桜P など

上記の例だと、1-2文字目がAで3文字目がアルファベットでないもの、4文字目がPのものが検索されます。

検索対象の文字列が下記だとすると

  • PPAP
  • PPPP
  • PP3P
  • PP柿P
  • C3PO

だと、下記が検索されます。

  • PP3P
  • PP柿P

が検索されます。

$…行の文末にあるものだけを検索します

正規表現気持ちがいい$
検索される
文字列
 文末が「気持ちがいい」
で終わる文章のみ

コーヒーブレイク

ではここで、テストを2題。

1.以下(1)〜(4)の4つの文で構成されたファイルを正規表現を使って検索するとき、「^気持ちがいい」で検索される行はどれか。全て選べ。

2.同様に、「気持ちがいい$」で検索されるのはどれか。全て選べ

(1) 気持ちがいい朝をむかえた
(2) 今日は気持ちがいい朝だ
(3) 今朝は本当に気持ちがいい
(4) 気持ちがいい

1.答えは(1)と(4)。文頭にしているものしか検索しません。
2.答えは(3)と(4)。文末にあるものしか検索しません。

参考までに、両方同時指定の場合は
「^気持ちがいい$」
だとどうなるでしょうか。

このルールだと、「気持ちがいい」と書かれている(4)のみが選択されます。

[ ] ブラケット…指定した文字のいずれか

正規表現今日は[火金日]曜日
検索ファイル
にある行

  • 今日は月曜日
  • 今日は火曜日
  • 今日は水曜日
  • 今日は木曜日
  • 今日は金曜日
  • 今日は土曜日
  • 今日は日曜日
検索される行

  • 今日は火曜日
  • 今日は金曜日
  • 今日は日曜日

となります。

[ ] と共に使う”-“

[]の中で範囲を示すために-を使うことができます。

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]

と書く代わりに

[A-Z]

と記載できます。

同様に、

[0-9]

と記載すると

[0123456789]

と同一の意味になります。

濁音や半濁音に注意
[か-こ]

これで検索される文字列は何でしょうか。
個別に書くと

か、き、く、け、こ

の5つになりそうですが、実は異なります。答えは

か、が、き、ぎ、く、ぐ、け、げ、こ

です。
同様に、

「あ-お」

とすると、検索される文字列は

あ、ぃ、い、ぅ、う、ぇ、え、ぉ、お

です。この並びは、JIS漢字コード表(JIS X 0208)の並びに基づいているためです。
並びを見たい時には、JIS漢字コード表、JIS X 0208を確認しましょう。

参考:http://www.infonet.co.jp/ueyama/ip/binary/x0208txt.html

[ ]と共に使う”^”

[の次に^が来た場合は、〜を除くの意味になる。

これはしょっちゅう使う、重要なルールです。

正規表現[^0-9]…0-9以外の文字

注1-1 :[ ]の中のメタ文字は基本、普通文字として認識される

[ ]の中で使われるメタ文字は、上記の場合を除き、メタ文字として認識されず、普通の文字として認識される。つまり、\ をつける必要がありません。

正規表現[.*]
検索される
文字列
 .
*

検索されるのは「.」と「*」ということになる。
[ ]の中はメタ文字ではない

注1-2 例外  “]” と “\”

ただし、[]の中に”]”を入れたい場合は、括弧が閉じると誤検索させないために[\]]と記載する必要がある。同様に[]の中に\を入れたい場合に、[\]としてしまうと、]が文字列と勘違いされて、右大括弧がないことになるので、この場合も[\\]とする必要がある。

注1-3:”-“

[]の中で範囲を示す-を文字列として使いたい場合は、注意が必要。

“-“が文字列であることが明確にするため、括弧内すぐに入れる。でないと誤検索になる。

正しい
正規表現
[-c] “-” と”c” が
検索される
正しくない
正規表現
[c-]誤検索になる。
c-で使われる”-“は
範囲を示す記号
と理解されるため

() グループ化

小括弧はグループ化が可能になります。

正規表現(ジャカ)+ジャンケン
検索できる
文字列例
ジャカジャンケン
ジャカジャカジャンケン
ジャカジャカジャカジャカジャンケン

縦棒と組み合わせると、広範な使い方が可能になります。
というか、縦棒を使う場合は1文字だけを使うことが少ないので、ほぼ()と合わせて使うと言っても良い。

正規表現(あん|肉|中華)まん
検索できる
文字列
あんまん
肉まん
中華まん

* + ? 同一文字の繰り返し3種

* 直前の文字が「0か、正の整数」個

たとえば、

正規表現きー*ん
検索できる
文字列例
きん
きーん
きーーん
きーーーん
きーーーーーーん

が検索されるということになります。

*は0以上の整数ということになります。

+ 直前の文字が「正の整数」個

例えば

正規表現どー+ん
検索できる
文字列例
どーん
どーーん
どーーーん
どーーーーーーーーん

となります。「ー」が無いのは含まれません。
無くてもOKなのは、+じゃなくて*です。

プラスが「正」を示すので、わかりやすいですね。

? 直前の文字が、0または1個

?は、直前の文字がない、あるいは1個を示します。

boys?

と検索すると、

boyでもboysでも検索されます。

あとは、iPhone8もiPhone 8も検索したい時など(iphoneの後にスペースがないか、あるか)にも使えます。

iPhone ?8

とすると、iPhone8 も iPhone 8 も検索されることになります。

?は2択です。直前の文字がある場合もない場合も検索です。

| いずれかの文字列

縦棒は「いずれかの文字列」を意味します。

りんご|みかん|いちご

とあれば、

  • りんご
  • パイナップル
  • みかん
  • ペン

のうち、「りんご」「みかん」が検索されます。

とりあえず、ここまでで一通り終了です。

具体的な、ありがちな例を見て行きましょう。

よく使う例

.*東京都.*

正規表現.*東京都.*
検索できる
文字列
 “東京都”を含む
全ての文字列
  • 東京都は日本の首都です
  • 昨日、東京都に宿泊した
  • 思い出の都道府県、東京都

上記3つが書かれたファイルがあるとすると、いずれの行も検索にヒットします。

まず、意味の確認から。

.は任意の1文字、*は個数が何個でもOK(0でも)
ということは、.*というのは、何があってもいいことになります。
.*のところには入力がなくてもいいので、東京都から始まる列も、東京都で終わる列も対象になります。

つまり、「東京都」を含む行全てが対象になります。

“.*”…ドットアスタリスクで囲めば、囲んだ文字が含まれる行は全て選択される

とりあえず、今日は時間切れなので、ここまでにします。(あとできっと追記します)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です