TITLE:間違いだらけの正規表現講座 level 8
#contentsx
* 一気に置き換えろ! [#pd32a649]
さて、とうとう第8回まできました。~
今回は、正規表現を使った置換の方法です。
これを覚えると、テキストの加工が一気に楽になります。~
人手で延々とやってる作業をコンピュータに
一瞬でやらせられる、魔法のような効果を発揮しはじめます。
* 単純な置換 [#j227c995]
さて、置換と言っても、単純な置換だけなら、何も覚えることはありません。
例えば、文章に含まれる、
ぽな
ぽなぽっぽ
ぽなぽっぽっぽ
といった文字列を、全て「Ponapalt」に置換することを考えましょう。
まずは、マッチする正規表現を考えます。
これはもう、すぐに出てくるのではないでしょうか。
ぽな(ぽっ)*ぽ?
でいいですね。
そうしたら、検索する文字列としてその正規表現を、置換する文字列として
「Ponapalt」を入れて、置換を行えばいいだけです。
正規表現テスターで行う場合は、「正規表現」「置換表現」をそれぞれ画面の
ように入れて、「置換!」を押してみてください。
&attachref(./regex8.png,nolink);
* だけど… [#p68ca1dd]
ですが、これではあまり面白くないですね。~
検索できる文字列の表現が広がっただけで、置き換え後の文字列は相変わらず
一定の文字列で、応用が利きません。
実は、正規表現で置換を行う場合、置き換え後の文字列の側にも、一定の
メタ文字を使うことができます。
それを覚えると、一気に応用が利くようになります。
* まずはおさらい [#c0386fbe]
第4回で学んだ、「まとめて一つ」を表す、
()
この記号。第4回では、この記号には二つの役割があると言いました。
-カッコの中の正規表現をまとめて1つの正規表現として扱う(グループ化)
-そのまとまった正規表現を、後で使えるように保存しておく(キャプチャ)
第4回で学んだのは「まとめて一つ」、グループ化の役割でした。~
今回、「後で使えるように保存しておく」、キャプチャの役割が効力を発揮します。
* キャプチャしたものを呼び出す [#cbfe574e]
さて、置き換え後の文字列で使えるメタ文字、それは、
「キャプチャしたものを呼び出す」メタ文字です。
$1~$9 キャプチャ1番目~9番目
ここで注意。~
Perlや正規表現テスターでは、「$1」「$2」といった表現を使いますが、
エディタ等によっては、「\1」「\2」といった表現を使う場合もあります。
例えば、EmEditorなどは「\」を使う例です。
使っているエディタのヘルプで、「置換表現」「後方参照」といった用語を探して、
「$」と「\」のどちらを使うのか調べておいてください。
さて、キャプチャしたものを呼び出す、とはどういうことか。
次のような例を考えてみましょう。
<a href="01234.html">へもぐろびん</a>
<a href="56789.html">もののけ</a>
<a href="keno.html">けのけの</a>
<a href="pona.html">ぽなぽな</a>
さて、このテキストから、リンク先のファイル名(01234.htmlとか)だけを
抜き出したいとします。置換でやるには、
<a href="01234.html">へもぐろびん</a> → 01234.html
<a href="56789.html">もののけ</a> → 56789.html
<a href="keno.html">けのけの</a> → keno.html
<a href="pona.html">ぽなぽな</a> → pona.html
こんな形で置換できればいいですね。
そのためには、「01234.html」の部分にマッチした文字列をとっておいて
(キャプチャ)、その文字列に置換(呼び出す)すれば良いわけです。
まず、検索する正規表現を考えます。
<a href="(.*)">.*</a>
ここで、最初の「.*」にカッコがついていることに注目してください。~
検索するだけなら、このカッコは必要ないですね。~
このように書くことによって、このカッコの中にマッチした文字列が、
後で利用できるように保存されます。~
これがキャプチャという意味です。
そして、置換後の文字列として、
$1
と書きます。~
「$1」は「1番目のキャプチャにマッチした文字列」という意味で、
ここではキャプチャは1個しかありませんから、先ほどの保存した文字列を
表すことになります。
正規表現テスターを立ち上げ、実際にやってみてください。~
おっと、オプションでシングルラインモードをOFF
(『「.」が改行にもマッチする』を外す)にしておくのを忘れないでくださいね。
&attachref(./regex8-2.png,nolink);
* 応用 [#b460311f]
では、応用編です。
先ほどの例文を、
へもぐろびん,01234.html
もののけ,56789.html
けのけの,keno.html
ぽなぽな,pona.html
とするにはどのようにすればよいでしょうか。~
キャプチャを2つ使えば解決します。~
少し考えてみてください。
答えは、
正規表現:<a href="(.*)">(.*)</a>
置換表現:$2,$1
こうなります。
「$1」「$2」が、それぞれ、1番目、2番目に出てきたカッコと~
対応しているわけです。~
それを使う順序は、カッコの順序と一致していなくてもいいわけですね。~
「,」は単なる普通の文字です。
このように、普通の文字とキャプチャをうまく組み合わせることによって、~
文章から特定の部位を抜き出したり、加工したりといったことが容易にできます。~
正規表現を使わないと、このような置換は無理ですよね。
* ちょっと脱線 [#b46a5a67]
今回、慣れないとちょっとややこしいかもしれませんが、如何でしょうか。~
キャプチャを使った置換を覚えると、正規表現の力を感じることが~
できるのではないかと思います。
* ご指摘などはこちらへ [#b35b5afb]
#comment