|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
Perlでは、正規表現を使うことができます。 正規表現というのは、「文字列の中から、特定の文字列あるいは特定の文字列パターンを 探し出す」という処理に使われます。パターンマッチというやつですね。 このページでは、正規表現関連の情報を覚え書きとしてまとめておきます。 (ただし、私がこれまでに学んだもの=実際にプログラムで使ったものだけです。全てではありません!)
これが全てではありません。よく使うもの限定です
\d | 数字1文字 (0〜9) | |
\w | 英数字1文字 (a〜z A〜Z 0〜9) | |
\s | 空白1文字(スペース、タブ) | |
. | 改行を除く任意の1文字 | |
\x… | 1バイトのアスキー文字を16進数で指定 | |
* | 直前の正規表現が0回以上連続する | |
+ | 直前の正規表現が1回以上連続する | |
^ | 文字列の始まり 正規表現の先頭で使用 | |
$ | 文字列の終わり 正規表現の末尾で使用 | |
[…] | 中に列挙されたいずれか1文字 | |
[^…] | 中に列挙されていないいずれか1文字 | |
[a-z] | 範囲指定。a〜zのいずれか1文字 | |
(…) | グループ。部分マッチが$1 $2・・・に入ります | |
A|B | A または B | |
[\xA1-\xDF] | shift_jisの半角カタカナ。
ただし全角文字の2バイト目が[\x40-\x7E\x80-\xFC]なので、単純な判定では
全角2バイト目がマッチしてうまくいきません。 |
正規表現内で文字としての / を使う場合などは \ でエスケープします。 |
| 正規表現内で全角文字を使うと正しく動かないです。Perlのバージョンによるかも? |
デフォルト変数 $_ を対象に、特定の文字列の有無をチェックするには次のようにします。
$found は、見つかれば1 見つからなければ0 です。
$found = /探したい文字列の正規表現/;
$_ 以外の変数を対象に、特定の文字列の有無をチェックするには次のようにします。
$found = ($var =~ /探したい文字列の正規表現/);
パターンマッチ演算子は本当は m// です。ただ、このmは省略することができるので、 単純に // と書くことが多いです。
//の後ろに、オプションを指定できます。
i ・・・ 大文字と小文字を区別しません。
デフォルト変数 $_ を対象に、特定の文字列を別の文字列に置換するには次のようにします。
s/置換したい文字列の正規表現/置換後の文字列/;
$_ 以外の変数を対象に処理をするには、文字列検索と同じで
=~ を使います。
s//の後ろの/の後ろに、オプションを指定できます。
g ・・・ 全てのマッチする文字列を置換します。指定しないと最初の1個だけ置換されます。
例えば、$_ の中に数字が含まれているかどうかを調べるには、
数字を表す正規表現の \d を使って、次のように書きます。
$found = /\d/; # $found は、見つかれば1 見つからなければ0 です。
この数字が、どの数字だったのかを知りたい場合は、その部分を括弧でくくります。
すると、$1という変数にその数字が入ります。
$found = /(\d)/; # $1 に数字が入ります。
括弧の中は複雑な正規表現でも問題ありません。
括弧は正規表現の一部だけでいいです。
括弧は複数使うことができ、その場合は最初の括弧から順番に
$1 $2 $3 ・・・ に文字列が入ります。
$found = /hoge([\d\w]+)foo(.*)haa/; # なにがしたいのかよく分かりません(^^;
例) URLが分かっているとき、ドメイン部分(正確にはホスト名ですね)を知るには次のようにします。 正規表現の中で特別な意味を持つ、/ . などの記号は \ でエスケープする必要があります。
$url =~ /\/\/([\w\.-]+)(.+)/; # $1 にホスト名が入ります。$2 にそこから後ろが全て入ります。
正規表現というのは、「習うより慣れろ」という感じがします(^^;
置換処理をしたいとき、置換したい文字列が全角文字だったりすると、意図したように動作しないことがあります。
これは全角文字の2バイト目にある\とか@とかが悪さをするためです。
解決するにはshift_jis以外の文字コードを使うか、index関数を使うかといったことが必要になります。
|
Perl/CGI研究室 'PERL-LABO' TOPへ |
戻る(History.Back) |
| Copyright (c) 'PERL-LABO' All Rights Reserved. リンクフリーです。 |