TITLE:間違いだらけの正規表現講座 level 4
#contentsx
* まとめて1つ [#k3a8a2d2]
なんとなく書いてきたこの記事も、第4回になりました。~
多分第10回くらいまでは続くと思います。
さて今回は、「まとめて1つ」について覚えましょう。~
だんだん「伏字」ではなくなってきますが、そこが正規表現の正規表現たるゆえんです。
* これまとめといて! [#rb24ddfd]
さて、今回の記号です。
()
カッコです。全角ではなく半角カッコですよ。~
この記号には2つの役割があります。~
-カッコの中の正規表現をまとめて1つの正規表現として扱う(グループ化)
-そのまとまった正規表現を、後で使えるように保存しておく(キャプチャ)
今回は、前者の「まとめて1つの正規表現として扱う」機能について説明します。~
この「まとめて1つの正規表現として扱う」ことを、「グループ化」といいます。
「後で使えるように保存しておく」機能については、また後で出てきますので、
今は忘れても大丈夫です。
「1つの正規表現として扱う」とはどういう意味でしょうか。~
例えば、次のような文字列を探したい場合、どうすればよいか思いつきますか。
うはうはうはうはうはうはうは
「うは」が1回以上繰り返す、という文字列です。~
「1回以上繰り返す」は、前回覚えました。「+」という記号で表現できますね。
では、次のような正規表現でマッチできるでしょうか。
うは+
やってみるとわかりますが、これではマッチできません。~
「+」の記号は、「直前の正規表現の1回以上の繰り返し」ですので、
今回「+」記号がくっつく相手は、「は」です。~
つまり、この正規表現では、「うは」「うはは」「うははははは」といった文字列には
マッチしますが、「うはうはうは」にはマッチできないのです。
こんな場合に効力を発揮するのが、今回の記号「()」です。
(うは)+
こうすることで、「(うは)」は「まとめて1つの正規表現として」扱われます。~
「+」記号は、そのまとまった1つの正規表現に対して働きます。~
つまり、「+」記号がくっつくのが、「うは」に拡張されるわけです。
* カッコの中にも正規表現 [#ea2e6d04]
さて、このカッコの中でも、好きな正規表現を使うことができます。~
例えば、
(うは+)+
この表現、どんな文字列にマッチすると思いますか。~
「うは+」だけだと、「うは」「うははは」といった文字列にマッチしますね。~
そして、それに対してさらに「+」がくっつきます。つまり、
「『うは』『うははは』といった文字列の1回以上の繰り返し」となりますので、
うはうはうはははははうはうはははうは
といった文字列にマッチするわけです。
* 練習 [#n1307454]
&attachref(./regex4.png,nolink);
さて、練習の時間です。
今回は、次のような文字にマッチする正規表現を考えてみてください。
うはwwwwwwうぇwwwwうぇうぇwwwっうぇwwwっうぇうぇうぇwww
分解すると、
-「うは」が先頭にあり
-その後に以下の表現が1回以上繰り返す
--「っ」が0回または1回あり
--その後に「うぇ」が0回以上あり
--その後に1文字以上の「w」が続く
ちょっと難しいですね。でも、順番に組み立てていきましょう。~
まず、「うは」が先頭にあるので、うは、と書きましょう。
うは
その後に以下の表現が1回以上繰り返す、とあるので、今日覚えたカッコを使います。
うは()+
カッコの中身は、まず、「っ」が0回または1回なので、こうなります。
うは(っ?)+
その次に、「うぇ」が0回以上続くのですね。
うは(っ?(うぇ)*)+
最後に、「w」が1文字以上続きます。
うは(っ?(うぇ)*w+)+
正規表現テスターを立ち上げ、適当な文字列を入れて、試してみてください。
* ちょっと脱線 [#f68570b1]
今回お話した正規表現を使うと、正規表現テスターのツリーに、
「グループ」「キャプチャ」といったものが増えると思います。
これは、「()」でまとめた文字列を、後で切り出すのに使いますが、
「どの部分にどれがマッチしたか」を見るのにも使えますので、
もし興味があれば、「グループ」や「キャプチャ」をクリックして、
どれに何がマッチしたのかをちょっと見てみると面白いかもしれません。
* ご指摘などはこちらへ [#m63596bc]
#comment