* 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.
リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
浮子屋商店もよろしく。

正規表現講座/9 のバックアップ(No.1)


細かいあれこれ

さて、大詰め、第9回です。
今回は、今までの講座の中で説明しなかった細かい部分を、ざっと説明します。
今までの講座で基本は分かっていると思いますので、 追加でこういう表現もあるんだな、程度に思っておけば良いと思います。

なお、今回の講座で出てくるメタ文字は、今までの講座以上に、正規表現を使うツール、 処理系に依存する可能性が高いため、使いたい時は、その処理系のマニュアルを 見ておいた方が無難です。

文字クラスの略記

数字1文字を表すには、

[0-9]

と書けば良いのでしたが、いっぱい数字を使う場合面倒ですね。 変わりに、

\d

という略記が使える場合が多いです。「\d」と書けば、「[0-9]」と書いたのと 同じ、という意味です。
以下のような略記が使える場合が多いです。

\d数字1文字、[0-9]と同じ意味
\s空白文字、半角の空白やタブや改行など、目に見えない文字*1
\S非空白文字、目に見える文字
\w単語を構成する文字、多くの処理系で [a-zA-Z0-9_] と同じ意味
\W単語を構成しない文字、多くの処理系で[^a-zA-Z0-9_] と同じ意味

n回マッチ

「*」は0回以上の繰り返し、「+」は1回以上の繰り返し、でした。
では、3回の繰り返し、を表すにはどうすれば良いでしょうか。
同じ正規表現を3回書けばよいのですが、面倒ですね。

そのために、n回の繰り返し、といった表現があります。

{n} ちょうどn回の繰り返し
{n,} 少なくともn回の繰り返し
{n,m} n回以上、m回以下の繰り返し

これを使うと、例えばケータイの電話番号などは、次のように書けるわけです。

\d{3}-\d{4}-\d{4}

この中のどれか

こんにちは、あかちゃん
こにゃちは、あおちゃん
こにゃにゃちは、きいろちゃん
こにゃにゃにゃちは、みどりちゃん
さようなら、くろちゃん

この文字列から、挨拶っぽい部分、つまり、こんにちは、さようなら、 こにゃにゃちは、のような部分を抜き出したいとします。

こんにちは、にもさようなら、にもマッチする正規表現は、 ちょっと思いつかないですよね。

そのような場合に、「この中のどれか」を表す記号があります。

| |で区切った中のどれか

この場合、

こんにちは|さようなら|こ(にゃ)+ちは

と書けば、挨拶の部分にマッチします。

ただし、他の正規表現に混ざって使う場合、|の区切りがどこまでの範囲なのかを
明示するため、

(こんにちは|さようなら|こ(にゃ)+ちは)

このようにカッコで囲んで置いたほうがよいです。
このカッコは、「まとめて一つ」のカッコと同じですから、グループ化と キャプチャの意味も併せ持つことに注意してください。

キャプチャしない!

さて、カッコにはグループ化とキャプチャの意味がありますが、 置換表現で「$1」などを使う場合、カッコを沢山使うと、何番目の カッコなのかが良く分からなくなり、面倒な場合があります。

たとえばさっきの例文で、色を表す語句の部分、「あか」や「あお」だけを 抜き出したいとします。

正規表現を次のように書くと:

(こんにちは|さようなら|こ(にゃ)+ちは)、(.*)ちゃん

色の部分のカッコが出てくるのは3番目なので、置換表現に使うのは、

$3

となりますが、数えるのは面倒です。

このような場合のため、「グループ化するけどキャプチャしない」記法があります。

(?:) グループ化するけどキャプチャしない

先ほどの表現を書き直すと、

正規表現:(?:こんにちは|さようなら|こ(?:にゃ)+ちは)、(.*)ちゃん
置換表現:$1

となり、必要な部分だけをキャプチャすることができます。

ちょっと脱線

今回紹介した以外にも、処理系によって色々な表現があります。
が、それらの表現は滅多に使わないと思います。
一応、普段使う可能性のあるのは網羅したつもりですが、「これが抜けてるぞ」等のご指摘をいただければ追加したいと思います。

ご指摘などはこちらへ


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

*1 全角の空白が含まれるかは処理系による