TITLE:間違いだらけの正規表現講座 level 9
#contentsx
* 細かいあれこれ [#y4c58161]
さて、大詰め、第9回です。~
今回は、今までの講座の中で説明しなかった細かい部分を、ざっと説明します。~
今までの講座で基本は分かっていると思いますので、
追加でこういう表現もあるんだな、程度に思っておけば良いと思います。
なお、今回の講座で出てくるメタ文字は、今までの講座以上に、正規表現を使うツール、
処理系に依存する可能性が高いため、使いたい時は、その処理系のマニュアルを
見ておいた方が無難です。
* 文字クラスの略記 [#p39eb699]
数字1文字を表すには、
[0-9]
と書けば良いのでしたが、いっぱい数字を使う場合面倒ですね。
変わりに、
\d
という略記が使える場合が多いです。「\d」と書けば、「[0-9]」と書いたのと
同じ、という意味です。~
以下のような略記が使える場合が多いです。
|\d|数字1文字、[0-9]と同じ意味|
|\s|空白文字、半角の空白やタブや改行など、目に見えない文字((全角の空白が含まれるかは処理系による))。|
|\S|非空白文字、目に見える文字|
|\w|単語を構成する文字、多くの処理系で [a-zA-Z0-9_] と同じ意味|
|\W|単語を構成しない文字、多くの処理系で[^a-zA-Z0-9_] と同じ意味|
* n回マッチ [#gf367049]
「*」は0回以上の繰り返し、「+」は1回以上の繰り返し、でした。~
では、3回の繰り返し、を表すにはどうすれば良いでしょうか。~
同じ正規表現を3回書けばよいのですが、面倒ですね。
そのために、n回の繰り返し、といった表現があります。
{n} ちょうどn回の繰り返し
{n,} 少なくともn回の繰り返し
{n,m} n回以上、m回以下の繰り返し
これを使うと、例えばケータイの電話番号などは、次のように書けるわけです。
\d{3}-\d{4}-\d{4}
* この中のどれか [#kca86171]
こんにちは、あかちゃん
こにゃちは、あおちゃん
こにゃにゃちは、きいろちゃん
こにゃにゃにゃちは、みどりちゃん
さようなら、くろちゃん
この文字列から、挨拶っぽい部分、つまり、「こんにちは」「さようなら」
「こにゃにゃちは」、のような部分を抜き出したいとします。
「こんにちは」にも「さようなら」にもマッチする正規表現は、
ちょっと思いつかないですよね。
そのような場合に、「この中のどれか」を表す記号があります。
| |で区切った中のどれか
この場合、
こんにちは|さようなら|こ(にゃ)+ちは
と書けば、挨拶の部分にマッチします。
ただし、他の正規表現に混ざって使う場合、|の区切りがどこまでの範囲なのかを~
明示するため、
(こんにちは|さようなら|こ(にゃ)+ちは)
このようにカッコで囲んで置いたほうがよいです。~
このカッコは、「まとめて一つ」のカッコと同じですから、グループ化と
キャプチャの意味も併せ持つことに注意してください。
* キャプチャしない! [#a6b09a4c]
さて、カッコにはグループ化とキャプチャの意味がありますが、
置換表現で「$1」などを使う場合、カッコを沢山使うと、何番目の
カッコなのかが良く分からなくなり、面倒な場合があります。
たとえばさっきの例文で、色を表す語句の部分、「あか」や「あお」だけを
抜き出したいとします。
正規表現を次のように書くと:
(こんにちは|さようなら|こ(にゃ)+ちは)、(.*)ちゃん
色の部分のカッコが出てくるのは3番目なので、置換表現に使うのは、
$3
となりますが、数えるのは面倒です。
このような場合のため、「グループ化するけどキャプチャしない」記法があります。
(?:) グループ化するけどキャプチャしない
先ほどの表現を書き直すと、
正規表現:(?:こんにちは|さようなら|こ(?:にゃ)+ちは)、(.*)ちゃん
置換表現:$1
となり、必要な部分だけをキャプチャすることができます。
* ちょっと脱線 [#ze2e73b8]
今回紹介した以外にも、処理系によって色々な表現があります。~
が、それらの表現は滅多に使わないと思います。~
一応、普段使う可能性のあるのは網羅したつもりですが、「これが抜けてるぞ」等のご指摘をいただければ追加したいと思います。
* ご指摘などはこちらへ [#p41dba33]
#comment