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