正規表現のキャプチャ

大雑把に言ってしまうと、正規表現とは、特殊な文字列の指定の仕方によって検索や置換を行う方法のことで、
キャプチャとは、マッチした検索文字列のうち対象ごとに異なる部分を保持して置換文字列に使うことを指します。

たとえば、

01 トラック 1.mp3
02 トラック 2.mp3
03 トラック 3.mp3

となっている各行に置換をほどこす場合に、
先頭の数字2文字を保持して置換後の文字列にそれぞれつかうといった用途があります。

正規表現では、
行頭は「^」、
行末は「$」、
任意の1文字は「.」、
直前のものの繰り返しは「*」、
0から9の数字は「[0-9]」、

というように指定するので、

MP3ファイルの名前のある各行は、
^[0-9][0-9].*\.mp3$
というかたちでマッチされます。
(なお、ここで「\.」となっているのは、任意の1文字を表す「.」ではなく文字通りのドットであることを示すための記法です。)

(この note では表示上「\」となっているようですが、テキストエディタ上では「半角の¥」のことです。以下でも同様です。)

ツールによって違いはありますが、
キャプチャを行うには、保持したい部分を「()」で囲って、
保持したものを「\1」「\2」などで呼び出すことになります。

「サクラエディタ」であれば、
「検索」→「置換」を選んで「正規表現」にチェックを入れた上で、
「置換前」に、
^([0-9][0-9]).*\.mp3$
「置換後」に、
track\1.mp3
と入れて「すべて置換」を実行すると、
先の各行は、
track01.mp3
track02.mp3
track03.mp3
に置換されます。

「Emacs」の場合は、ALT+Xキーを押して、「replace-regexp」と入力した後に、置換前の文字列、置換後の文字列の順に入れていきますが、
キャプチャの部分は始点を「\(」終点を「\)」のように「\」をつけた括弧で囲います。
すなわち、
^\([0-9][0-9]\).*\.mp3$
となります。

さて、前回Excelとメモ帳を駆使してつくった「ren」のバッチファイルはどうすれば作れるでしょうか。
実は、例につかったMP3のリストは、
01 トラック 1.mp3
02 トラック 2.mp3
03 トラック 3.mp3
04 トラック 4.mp3
05 トラック 5.mp3
06 トラック 6.mp3
07 トラック 7.mp3
08 トラック 8.mp3
09 トラック 9.mp3
10 トラック 10.mp3
のように、
一けた台のファイルの二つ目の数字が0をつけずに付されています。
このために置換前のファイル名を再現する必要上少しややこしくなります。
各行についてそれぞれ二つの数字列をキャプチャしなくてはならないからです。


あまりエレガントではありませんが、
置換前の文字列を、
^([0-9][0-9]) .* (.*)\.mp3$
として、
置換後の文字列を、
ren "\1 トラック \2.mp3" track\1.mp3
とすると、
なんとかできるようです。

ren "01 トラック 1.mp3" track01.mp3
ren "02 トラック 2.mp3" track02.mp3
ren "03 トラック 3.mp3" track03.mp3
ren "04 トラック 4.mp3" track04.mp3
ren "05 トラック 5.mp3" track05.mp3
ren "06 トラック 6.mp3" track06.mp3
ren "07 トラック 7.mp3" track07.mp3
ren "08 トラック 8.mp3" track08.mp3
ren "09 トラック 9.mp3" track09.mp3
ren "10 トラック 10.mp3" track10.mp3

たしかに前回と同じものができました。

なお、ここで使用した例は、Windows Media Player でCDをMP3形式で取り込んでネット経由の名前取得を行わなかった場合のファイル名になっています。
機械的に連番がふられている他の場合にも多少手を加えれば応用できるはずです。
コツとしては各行のどこが違うのかどこが同じなのかを見極めて、違う部分をキャプチャでとらえて再現するところです。

毎回同じように取り込んで名前を変える作業を行うならば、いちど100行分くらいのものをつくっておいて使いまわすのもよいでしょう。
CD複数セットの場合に備えて、変更後の名前を「CD1_Track01.mp3」などとしたものと別に「CD2_Track01.mp3」から始まるものなどを用意しておくとさらに便利です。
「Track」の部分のみを適当に置換するだけで「TOEIC_LR6_CD1_Track01.mp3」のように内容を端的に表したファイル名にすることも可能です。
もちろん、名前の変え方に一貫性がある限り、再び名前を変えるのも既に述べた手法の応用で簡単にできます。

この記事が気に入ったらサポートをしてみませんか?