正規表現について

多くのテキストエディターやプログラム、Exelなどでも使えるこの正規表現。かなり便利ですよね。
これを知っていると知らないとでは作業時間に大きく影響してきますので「正規表現はこういうことが出来る」と覚えておくといいと思います。

基本部分

基礎部分です。
正規表現は特別な意味を持つ文字と、通常の文字列を組み合わせて記述します。












正規表現説明
*直前の文字の0回以上に一致
+直前の文字の1回以上に一致
.1つの任意文字(A, B, C, ...) (\nを除く)
?直前の文字の0回または1回に一致
{n}直前の文字がちょうどn回に一致
{n,}直前の文字がn回以上に一致
{n,m}直前の文字がn回以上,m回以下に一致
[xyz]xかyかzの何れか1文字に一致
\w英数文字かアンダーバーを表す(a〜z,A〜Z,0〜9,_)
\d数値文字を表す(0〜9)

基本部分2

指定を細かくします。

正規表現説明使用例例の説明
|選択AA|BB|CCAAまたはBBまたはCCに一致
()グループ化A(01|02|03)A01またはA02またはA03に一致
^行の最初^A行頭のAに一致
$行の最後A$行末のAに一致
[^A]A以外の文字[^ABC]+DEFなど1つ以上のABC以外の文字に一致
\s空白,タブ\s+1つ以上の空白に一致
\S空白文字以外\S+1つ以上の空白以外の文字に一致
\d数値文字\d+123など1つ以上の数字に一致
\D\d以外\D+ABCなど1つ以上の数字以外の文字に一致
\w英数文字かアンダーバー\w+ABC123など1つ以上の英数文字かアンダーバーに一致
\W\w以外の文字\W+-+!?など1つ以上の英数文字かアンダーバー以外(記号)に一致
\b単語の境界(\wと\Wの境界)ABC\bDEFABCとDEFの間に英数文字かアンダーバー以外の文字がある文字列に一致

置換の文法

正規表現 説明 使用例 例の説明
s/A/B/ 最初に一致した文字列AをBに置換 $x = 'AAA';
$x =~ s/A/B/;
$xは'BAA'となる
s/A/B/i 上記と同様だが、アルファベットの大文字と小文字を区別しない $x = 'aaa';
$x =~ s/A/B/;
$xは'Baa'となる
s/A/B/g 文字列中の一致したすべての文字列AをBに置換 $x = 'AAA';
$x =~ s/A/B/g;
$xは'BBB' となる
s/(A)-(B)/$1+$2/ AとBをそれぞれ$1と$2という変数に入れて後で参照する $x = '12:34';
$x =~ s/(\d+):(\d+)/$1時$2分/;
$xは'12時34分'となる
s/A//g 文字列中の一致した文字列Aを消去 $x = 'AAA';
$x =~ s/A//g;
$xは''となる

エスケープ

正規表現では特別な意味を持つ文字がいくつかあり、そのまま記述すると意味のある指定と解釈されます。
これらの文字を、通常の文字列として認識させる場合は、エスケープしてください。

エスケープ前 エスケープ後 注意点
\ \\ エスケープを行う文字なので、\ にマッチングさせたい場合は \\ と記述してください。
* \*  
+ \+  
. \.  
? \?  
{ } \{ \} 出現回数指定文字なのでエスケープが必要
( ) \( \) エスケープしないと後方参照が作成される。またはグループ化される。
[ ] \[ \] 直前文字の出現回数指定文字なのでエスケープが必要
^ \^ 行頭を指定することになる。
$ \$ 行末を指定することになる。Perlの場合は、変数の先頭文字である。
- \- [ ]の中に書く場合のみエスケープが必要
/ \/ Perlでは / が正規表現の指定になるのでエスケープが必要。

後方参照について

後方参照とは、置換前の一部の文字列を( )でくくると、その文字列を置換後に$1,$2,$3...という文字で参照することを言います。
( )でくくった物を呼び出せる"変数"みたいなものを想像するとイメージしやすいかもしれません。

ABCDEF //検索対象文字列
(.*)DEF //検索文字列
DEF$1 //置換文字列
DEFABC //置換結果

上記の例は"ABCDEF"を"(.*)DEF"で検索しています。()の中には"ABC"が入りますね。
置換文字列には"DEF"のあとに"$1"があります。
置換結果は"DEF"のあとにあった"$1"は"ABC"を参照していますので"DEFABC"となります。


最短一致

例えば下記例1のようにA〜Dをヒットさせたいとき"A.*D"と検索すると最後の"D"の間の文字まで拾ってしまいます。
これを最初の"D"までにヒットさせるには例2のように"D"の前に"?"を記述します。

例1


ABCDEFG_ABCDEFG_ABCDEFG //検索対象文字列

A.*D //検索文字列

ABCDEFG_ABCDEFG_ABCDEFG //検索結果

例2


ABCDEFG_ABCDEFG_ABCDEFG //検索対象文字列

A.*?D //検索文字列

ABCDEFG_ABCDEFG_ABCDEFG //検索結果

まだまだたくさんテクニックはあると思いますがこのくらい覚えておくだけでたいがいのことは解決できます! ><