【正規表現】メタ文字などの基本

#正規表現とは
文字列の規則を表現する方法
ある情報の中から特定の規則に知った文字列を検索したい場合や、入力・出力された情報が規則に通りになっているかを判定するために使われます。
例えば、携帯電話の番号は”090","080","070"から始まり、ハイフンをつけるとしたら"000-0000-0000"の形になる。
これを正規表現で書くと"0[7-9]0-[0-9]{4,4}-[0-9]{4,4}"と表現することができます。(他の書き方もあります)
いちいち文字を分解して、3桁-4桁-4桁になっているか、最初の3桁は0?0の形になっているか、などチェックする必要がなくなって便利になります。

私はサーバーにたまった大量のログから特定の情報を抜き取ったり、サイトURLのパラメータを仕訳けるために使ったりしていました。

#メタ文字
メタ文字とは、正規表現の中で特別な意味を持つ文字や記号。
これを知っていないと全く意味がないけど、数が少ないから使っているうちに覚えられる。
ここでは、「場所を意味するもの」「文字や文字グループを意味するもの」「繰り返しを意味するもの」

##場所を意味するメタ文字
|表現|意味|
|---|---|
| ^ <br/>(キャレット)|文の先頭。文字ではなく場所を意味する。<br/>改行されずに折り返されたものは対象とならず、そのデータの先頭や改行後の始め。|
| $ <br/>(ダラー)|文の最後。文字ではなく場所を意味する。<br/>改行がある場合は改行(改行コード)の直前。|

##文字や文字グループを意味するメタ文字
|表現|意味|利用例|
|---|---|---|
| . <br/>(ピリオド)|任意の1文字。<br/>1文字分を占有するものなので、スペースも含まれる。|"ABC"の文字列を"."で検索すると、<br/>"A","B","C"の三文字がヒットする。|
| &#124; <br/>(パイプ)|パイプで区切られたいずれかの文字列。|"リンゴ&#124;りんご&#124;林檎"という表現であれば、<br/>カタカナ、ひらがな、漢字のりんごがヒットする。|
| \[\] <br/>(大カッコ)|大カッコ内のいずれかの文字。|"[Aaあア]"という表現であれば、<br/>"A","a","あ","ア"がヒットする。|
| [A-Z] |大カッコの応用①<br/>半角大文字のA~Zつまりすべてのアルファベット一文字。|"A"も"B"も"X"もヒットする。ただし"a","g","u"などの小文字はヒットしない。|
| [a-z0-9] |大カッコの応用②<br/>半角小文字のa~zもしくは0~9の数字一文字。|"e","m","3","8"などがヒットする。<br/>大文字のアルファベットはヒットしない。|
| [^A] |大カッコの応用③<br/>先頭に”^”をつけると、否定を意味する。<br/>”^”を指定したい場合は、<br/>[\^]で”^”を対象、<br/>[^\^]もしくは[^^]で”^”を非対象とする。|“A”以外の文字。|


##エスケープ文字
メタ文字(記号)を文字としてヒットさせるときに使う

|表現|意味|
|---|---|
| \\  <br/>(バックスラッシュ<br/>環境によっては円マーク(￥)の半角になることも)|メタ文字の前につけることで、メタ文字を単なる文字として認識させる。<br/>バックスラッシュを検索したい場合は、\\\\と表記する。|



##繰返しを意味するメタ文字
|表現|意味|利用例<br/>検索対象|<br/>検索文字|<br/>検索結果|
|---|---|---|---|---|
| * <br/>(アスタリスク)|直前の文字を0回以上連続で繰り返す。(最長一致)|\[例1]“aaab”<br/><br/>\[例2]“aaab”|\[例1]“a*”<br/><br/>\[例2]"c*"|\[例1]”aaa”の1か所<br/><br/>\[例2]各文字の前後5か所(cが0回繰返されている場所)|
| + <br/>(プラス)|直前の文字を1回以上連続で繰り返す。(最長一致)|\[例1]“aaab”<br/><br/>\[例2]“aaab”|\[例1]“a+”<br/><br/>\[例2]"c+"|\[例1]”aaa”の1か所<br/><br/>\[例2]該当なし|
| ? <br/>(クエスチョンマーク)|直前の文字を0回もしくは1回だけ繰り返す。(最長一致)|\[例1]“aaab”<br/><br/>\[例2]“aaab”|\[例1]“a?”<br/><br/>\[例2]"c?"|\[例1]”a”が3か所<br/><br/>\[例2]各文字の前後5か所(cが0回繰返されている場所)|
| {n} <br/>(中カッコ)|指定回数の繰返し。(最長一致)<br/>"n"には数字を入れる。|\[例1]“aaab”<br/><br/>\[例2]“aaaab”|\[例1]“a{2}”<br/><br/>\[例2]"a{2}"|\[例1]最初の”aa”の1か所<br/><br/>\[例2]1,2文字目の"aa"と3,4文字目"aa"の2か所|
| {n,} |指定回数以上の繰返し。(最長一致)<br/>"n"には数字を入れる。|\[例1]“aaab”<br/><br/>\[例2]“aaaab”|\[例1]“a{2,}”<br/><br/>\[例2]"a{2,}"|\[例1]”aaa”の1か所<br/><br/>\[例2]”aaaa”の1か所|
| {n,m} |指定回数範囲内の繰返し。(最長一致)<br/>"n","m"には数字を入れる。|\[例1]“aab”<br/><br/>\[例2]“aaaab”|\[例1]“a{2,3}”<br/><br/>\[例2]a{2,3}”|\[例1]”aa”の1か所<br/><br/>\[例2]1~3文字目の”aaa”の1か所|

##繰返しの最短一致表現
これまでの記述はすべて最長一致がヒットする。
繰返しメタ文字の後ろに”?”をつけると最短一致になる。

|表現|意味|
|---|---|
| +? |1回以上の繰返し。(最短一致)|
| *? |0回以上の繰返し。(最短一致)|
| ?? |0回か1回の繰返し。(最短一致)|
| {}? |指定範囲内での最短一致。<br/>{n,}?,{n,m}?もそれぞれの指定範囲での最短一致。|

動作確認していて気付いたけど、”*?”と”??”の最短一致って0回(各文字間)になるような。。。

##グループ化
|表現|意味|利用例<br/>検索文字|<br/>ヒットする文字列の例|
|---|---|---|---|
| () <br/>(小カッコ)|複数の文字で構成される文字列。<br/>これ単独で利用しないかな。<br/>他のメタ文字と組み合わせて利用することが多い。| (みかん) | ”みかん” <br/>これしかヒットしない。カッコ必要ないじゃん、って話ですよね(笑)|
| (&#124;)|カッコ内のパイプで区切られたいずれかの文字列。<br/>パイプと変わらないように思いますが、使えるところがあります。|こたつで(みかん&#124;ミカン)を食べる|一致対象①：こたつでみかんを食べる<br/>一致対象②：こたつでミカンを食べる|
| ()+ |カッコ内の文字列が連続で繰返り返される文字列。(最長一致)|わたしは(みかんが)+好き|一致例①<br/>私はみかんが好き<br/><br/>一致例②<br/>私はみかんがみかんがみかんが好き|
| (.*) |検索ではなく置換処理で使えます。<br/>カッコ内の文字列を、置換後の文字に利用します。(".*"以外でも可能です)<br/>グルーピングした順に置換内容で\$1,\$2と指定して利用することができます。|置換元の文字列<br/>“私はみかんとりんごが好きです。私はバナナとメロンが嫌いです。”<br/><br/>検索文字<br/>検索”私は(.*)が(好き&#124;嫌い)です”<br/><br/>置換内容<br/>”\$1 \$2”|置換結果<br/>”みかんとりんご 好き。バナナとメロン 嫌い。”<br/><br/>グループ外の”私は”,”が”,”です”は消えて、<br/>「グループ内の文字」「\$1と\$2の間にある半角スペース」<br/>「検索対象外の”。”」だけが残ります。|