* U K I Y A H O N P O * Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, che la diritta via era smarrita. |
間違いだらけの正規表現講座 level 9
細かいあれこれさて、大詰め、第9回です。 なお、今回の講座で出てくるメタ文字は、今までの講座以上に、正規表現を使うツール、 処理系に依存する可能性が高いため、使いたい時は、その処理系のマニュアルを 見ておいた方が無難です。 文字クラスの略記数字1文字を表すには、 [0-9] と書けば良いのでしたが、いっぱい数字を使う場合面倒ですね。 変わりに、 \d という略記が使える場合が多いです。「\d」と書けば、「[0-9]」と書いたのと
同じ、という意味です。
n回マッチ「*」は0回以上の繰り返し、「+」は1回以上の繰り返し、でした。 そのために、n回の繰り返し、といった表現があります。 {n} ちょうどn回の繰り返し {n,} 少なくともn回の繰り返し {n,m} n回以上、m回以下の繰り返し これを使うと、例えばケータイの電話番号などは、次のように書けるわけです。 \d{3}-\d{4}-\d{4} この中のどれかこんにちは、あかちゃん こにゃちは、あおちゃん こにゃにゃちは、きいろちゃん こにゃにゃにゃちは、みどりちゃん さようなら、くろちゃん この文字列から、挨拶っぽい部分、つまり、「こんにちは」「さようなら」 「こにゃにゃちは」、のような部分を抜き出したいとします。 「こんにちは」にも「さようなら」にもマッチする正規表現は、 ちょっと思いつかないですよね。 そのような場合に、「この中のどれか」を表す記号があります。 | |で区切った中のどれか この場合、 こんにちは|さようなら|こ(にゃ)+ちは と書けば、挨拶の部分にマッチします。 ただし、他の正規表現に混ざって使う場合、|の区切りがどこまでの範囲なのかを (こんにちは|さようなら|こ(にゃ)+ちは) このようにカッコで囲んで置いたほうがよいです。 キャプチャしない!さて、カッコにはグループ化とキャプチャの意味がありますが、 置換表現で「$1」などを使う場合、カッコを沢山使うと、何番目の カッコなのかが良く分からなくなり、面倒な場合があります。 たとえばさっきの例文で、色を表す語句の部分、「あか」や「あお」だけを 抜き出したいとします。 正規表現を次のように書くと: (こんにちは|さようなら|こ(にゃ)+ちは)、(.*)ちゃん 色の部分のカッコが出てくるのは3番目なので、置換表現に使うのは、 $3 となりますが、数えるのは面倒です。 このような場合のため、「グループ化するけどキャプチャしない」記法があります。 (?:) グループ化するけどキャプチャしない 先ほどの表現を書き直すと、 正規表現:(?:こんにちは|さようなら|こ(?:にゃ)+ちは)、(.*)ちゃん 置換表現:$1 となり、必要な部分だけをキャプチャすることができます。 ちょっと脱線今回紹介した以外にも、処理系によって色々な表現があります。 ご指摘などはこちらへ |