Perl 正規表現置換 超基本

perlに関わらず、正規表現知っておくとあらゆることが快適。


最近ようやく正規表現での置換を快適に行えるようになってきたので、このぐらい知ってたら正規表現での置換を便利に使えるんじゃね?くらいのレベルをまとめてみる。


大抵のページを見ると、パターンマッチの解説に重点が置かれているけど、自分含めた初心者が正規表現の便利さがわかるのは、正規表現での置換なのではないかと思う。少なくとも自分は、パターンマッチより、置換後に使う $1 がわかってから正規表現が面白くなってきた。


まず、変数$fooの正規表現での置換の基本フォーマット

$foo =~ s/探す方/置き換える方/オプション;


超基本の繰り返し記号

*
直前の0回以上の繰り返し
+
直前の1回以上の繰り返し
?
直前の0回または1回の繰り返し
x{a,b}
a以上、b以下の繰り返し(片方のみも可能)x{a}に限ってa回のxにマッチする

初めてのPerlによると、
「*」は、直前のものが星の数ほど現れてもよい、たとえ0回でもよい。
「+」は、直前のものに加えて、同じものが何個あってもよい
「?」は、直前のものがある?それともない?
と覚えると良いらしい。実際によいかどうかはわからない。


その他超基本いくつか

[]
括弧で閉じた中身全部
[]の最初に^
括弧で閉じた中身、以外のもの
.
改行以外全部
^
行頭
$
行末
\
エスケープ(上に書いたような記号を使いたいときに直前におく


知っておくと面倒が減る記号

\d
数字
\D
数字でない
\w
アルファベットと数字
\W
アルファベットでも数字でもない
\s
空白(スペース、タブ、改行)
\S
空白以外

大文字にすると、否定になる


.*(改行以外のあらゆる文字列)とか、^$(空白行)とか、パターン化されたものをいくつか覚えておくだけでも、結構な使い道が見つかる。(例えば、ソースコードのタブを空白に置き換える、とか、空の改行をなくす、とか)


ひとまずこのくらい覚えて、試しに何か置き換えてみる。


ここで、括弧()。「探す方」のある部分を括弧で括っておくと、「置き換える方」で順番に、$1 $2 で取り出せる。これがわかると正規表現楽しい、ってなってくる。ちょっとしたテキストの一括変更なんかが快適に出来る。


ケータイの番号をハイフン付きにしてみる

my $phone = 09012345678;
#\d{3}で3文字の数字にマッチ。それぞれを()でグループにしておいて、あとから-で繋げて、取り出す。
$phone =~ s/(\d{3})(\d{4})(\d{4})/$1-$2-$3/;


とにかく、()で括っておいたら、中身はあとから $1 $2 ... で取り出せる。
マッチしたある部分はそのまま残して、一部を置換する方法、ってのがウェブで見つけにくかったので書いてみた次第。


正規表現の正確なルールなんかは、(Perlなら)「Perl 正規表現」でなど検索すればいくらでも見つかるので、自分が気に入ったページを探すと良いと思います。