今日はエディタとかでよく目にする「正規表現」。
 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でも)
 ということは、.*というのは、何があってもいいことになります。
 .*のところには入力がなくてもいいので、東京都から始まる列も、東京都で終わる列も対象になります。
つまり、「東京都」を含む行全てが対象になります。
“.*”…ドットアスタリスクで囲めば、囲んだ文字が含まれる行は全て選択される
とりあえず、今日は時間切れなので、ここまでにします。(あとできっと追記します)
ブログランキング



コメントを残す