* 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
浮子屋商店もよろしく。

Source of 正規表現講座/8

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