正規表現
2011年03月08日
最近は、WEBのコーディングでも正規表現を使うことが多くなってきました。
はじめは呪文のような記号が並んでいて、なんのことかさっぱりわかりませんでしたが、使えるようになるとそれほど難しくもなく便利なので、覚えておくと役に立ちます。
そこで、正規表現についてわかりやすく説明してあるサイトを紹介したいと思います。
【サルにもわかる正規表現入門】
名前の通り、サルにも(?)わかりやすく説明してあります。
といっても、よく使うものは限られていて、
.* : なんでもいい文字の連続
^ :行の先頭
$ :行の最後
[^A-Z] :A-Zを除く
() :グループ化
くらいでしょうか?
例を2つあげて簡単に説明します。
(例1)
たとえば、MT(Movable Tyle)のテンプレート作成時に出てくる
<$MTArchiveLink regex_replace="/template/(.*\/)[^\/]*$/","$1" abs2rel="1"$>
では、
regex_replace="/template/(.*\/)[^\/]*$/","$1"
の部分に正規表現が使われています。
これは、
regex_replace="/置換前の文字列/","置換後の文字列"
のような構造になっています。
置換前の文字列を見てみると、
template/(.*\/)[^\/]*$
なので、
最後に$が付いているときは最後から読んでいくと
$(行末に)
[^\/](スラッシュ以外の:\/:スラッシュはメタ文字なので、通貨の円マーク(\)を文字の前につける)
*(文字がいくつかあって)
template/(.*\/)(スラッシュがあったところから"template/"という文字で囲まれた部分をグループ化する)
となります。
この場合、
template/blog/01/03/index.html…①
のような文字列が置換対象になります。
そして、置換後の文字列は"$1"となっていたので、置換前の文字列の中で()で囲まれてグループ化された部分を$1に入れる、という意味になります。
①のような文字列の場合だと、置換後の文字列は
blog/01/03/
となります。
(例2)
3行あいているところを1行にしたい、という場合を考えます。
今日は\n
天気が\n
よかった\n
\n
\n
今日は\n
天気が\n
悪かった\n
\n
\n
\n
終わり\n
という文字列があった場合、対象となる部分は
今日は\n
天気が\n
よかった\n
\n
\n
今日は\n
天気が\n
悪かった\n
\n
\n
\n
終わり\n
\n\n\n色の部分だけです。
\n\n\n色の部分は、改行が3つ連続していますが、3行連続の空行ではないため、置換したくありません。
このようなときは、正規表現を使って
置換前の文字列:
^\n\n\n
置換後の文字列:
\n
とします。
置換前の文字列に"^"を付けているので、行頭の改行を探し、そこから連続する改行を検索します。
そして、改行1つに置き換えます。
エディタにも正規表現を扱えるものがあるので、知っていると重宝します。
はじめは呪文のような記号が並んでいて、なんのことかさっぱりわかりませんでしたが、使えるようになるとそれほど難しくもなく便利なので、覚えておくと役に立ちます。
そこで、正規表現についてわかりやすく説明してあるサイトを紹介したいと思います。
【サルにもわかる正規表現入門】
名前の通り、サルにも(?)わかりやすく説明してあります。
といっても、よく使うものは限られていて、
.* : なんでもいい文字の連続
^ :行の先頭
$ :行の最後
[^A-Z] :A-Zを除く
() :グループ化
くらいでしょうか?
例を2つあげて簡単に説明します。
(例1)
たとえば、MT(Movable Tyle)のテンプレート作成時に出てくる
<$MTArchiveLink regex_replace="/template/(.*\/)[^\/]*$/","$1" abs2rel="1"$>
では、
regex_replace="/template/(.*\/)[^\/]*$/","$1"
の部分に正規表現が使われています。
これは、
regex_replace="/置換前の文字列/","置換後の文字列"
のような構造になっています。
置換前の文字列を見てみると、
template/(.*\/)[^\/]*$
なので、
最後に$が付いているときは最後から読んでいくと
$(行末に)
[^\/](スラッシュ以外の:\/:スラッシュはメタ文字なので、通貨の円マーク(\)を文字の前につける)
*(文字がいくつかあって)
template/(.*\/)(スラッシュがあったところから"template/"という文字で囲まれた部分をグループ化する)
となります。
この場合、
template/blog/01/03/index.html…①
のような文字列が置換対象になります。
そして、置換後の文字列は"$1"となっていたので、置換前の文字列の中で()で囲まれてグループ化された部分を$1に入れる、という意味になります。
①のような文字列の場合だと、置換後の文字列は
blog/01/03/
となります。
(例2)
3行あいているところを1行にしたい、という場合を考えます。
今日は\n
天気が\n
よかった\n
\n
\n
今日は\n
天気が\n
悪かった\n
\n
\n
\n
終わり\n
という文字列があった場合、対象となる部分は
今日は\n
天気が\n
よかった\n
\n
\n
今日は\n
天気が\n
悪かった\n
\n
\n
\n
終わり\n
\n\n\n色の部分だけです。
\n\n\n色の部分は、改行が3つ連続していますが、3行連続の空行ではないため、置換したくありません。
このようなときは、正規表現を使って
置換前の文字列:
^\n\n\n
置換後の文字列:
\n
とします。
置換前の文字列に"^"を付けているので、行頭の改行を探し、そこから連続する改行を検索します。
そして、改行1つに置き換えます。
エディタにも正規表現を扱えるものがあるので、知っていると重宝します。