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