何文字でも入る
さて、第3回です。今回は、「何文字でも入る」伏字のやり方を覚えましょう。
この表現を覚えると、やっと正規表現っぽい使い方ができるようになります。
ちょっとややこしいですが、頑張って覚えてください。
これが何文字でも続く
さて、「何文字でも入る」伏字というのは何かというと、イメージとしては、
「愛天使~きゅん」というような表現で、「~」が果たす役割に似ています。
「~」の中には、「何でもいいから何文字かの表現」が入る気がしますね。
ただし、コンピュータの正規表現の世界では、これを2つの正規表現の組み合わせで表現します。
さて、今回の最初の正規表現記号です。
*
この記号。これは、「直前の正規表現の、0回以上の繰り返し」という意味になります。
ちょっとイメージが掴みにくいと思いますので、実際の使い方を挙げてみましょう。
何でもいいから0文字以上
.*
正規表現「.」と組み合わせた場合。
「.」は、「何でもいいから1文字」を表す正規表現でしたね。
それと「*」を組み合わせると、「何でもいいから1文字が0回以上繰り返し」、
つまり、「何でもいいから0文字以上続く」という意味になります。
例えば、「けの.*ぴ」という正規表現には、「けのぴ」(0文字)、「けのっぴ」(1文字)
「けのけのけのっぴ」(5文字)の何れもマッチします。
数字0文字以上
[0-9]*
正規表現「[0-9]」と組み合わせた場合。
「[0-9]」は、「[]の中のどれか一つ」を表す正規表現でしたね。
つまり、組み合わせると、「0~9の文字が0文字以上続く」という意味になります。
この正規表現には、「0」「8390」といった、数字の連続したものが全てマッチします。
「」(空文字、数字0文字)もマッチすることに気をつけてください。
指定した文字0文字以上
けの*っぴ
普通の文字と組み合わせることもできます。
この場合、「*」と組み合わせられているものは、直前にある「の」ですので、
「けのっぴ」「けののっぴ」「けののののっぴ」といったものがマッチします。
「けっぴ」もマッチすることに気をつけてください。「の」が0文字、という意味ですね。
1文字以上
さて、見てきたとおり、「*」は、「0回以上の繰り返し」となっているため、
使いにくい場合もあります。そのために別の表現も用意されています。
+
これは、「1回以上の繰り返し」を表します。
つまり、「けの+っぴ」と書けば、「けのっぴ」はマッチしますが、「けっぴ」は
マッチしなくなります。
0回もしくは1回
?
これは、「0回もしくは1回の繰り返し」を表します。
つまり、「愛?天使」と書けば、「愛が0回もしくは1回あり、その後に天使が続く」
=「愛天使」と「天使」がヒットします。
練習
さて、練習の時間です。
今回は、次のような文字にマッチする正規表現を考えてみてください。
うはwwwwwwwwおkkkkkwwwwwww
分解すると、
- 「うは」が先頭にあり
- その後に1文字以上の「w」が続き
- その後に「お」があり
- その後に1文字以上の「k」が続き
- その後に1文字以上の「w」が続く
正規表現テスターを立ち上げ、適当にうはwwwwおkkkwwwwといった
文字列を入れ、正規表現でマッチさせてみてください。
正解の一例を以下に示しておきます。
うはw+おk+w+
最長一致!
今回お話した正規表現を使った場合、「どこまでがマッチするか」が微妙な場合が出てきます。
たとえば、「うはwwおkkkkk」という文字列に対して、正規表現「うは.*k*」を適用したとしましょう。
この場合、「.*」にマッチするのはどこまでで、「k*」にマッチするのはどこまででしょう?
正規表現の場合、特に指定しない限り、大抵の場合、「最長一致の法則」というものが適用されます。
この場合で言えば、「.*」にはマッチできる限り最長の部分がマッチしますので、
実際には、「.*」には「wwおkkkkk」が全てマッチし、
その後に残った「k*」には空文字がマッチする形になります。
まだそれほど気にしなくてもいいですが、そのうち困ったことが出てくる場合があります。
その際にまた改めて説明します。
ちょっと脱線
今回お話した「*」や「?」は、「量指定子」などと呼ばれています。
正規表現がマッチする「量」を指定するからでしょうか。
ご指摘などはこちらへ