Perl/CGI研究室 'PERL-LABO'

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|BA または B

[\xA1-\xDF]shift_jisの半角カタカナ。 ただし全角文字の2バイト目が[\x40-\x7E\x80-\xFC]なので、単純な判定では 全角2バイト目がマッチしてうまくいきません。

正規表現内で文字としての / を使う場合などは \ でエスケープします。
正規表現内で全角文字を使うと正しく動かないです。Perlのバージョンによるかも?

正規表現の使い方覚え書き

文字列の中から特定の文字列の有無を検査するには → //

デフォルト変数 $_ を対象に、特定の文字列の有無をチェックするには次のようにします。 $found は、見つかれば1 見つからなければ0 です。

$found = /探したい文字列の正規表現/;

$_ 以外の変数を対象に、特定の文字列の有無をチェックするには次のようにします。

$found = ($var =~ /探したい文字列の正規表現/);

パターンマッチ演算子は本当は m// です。ただ、このmは省略することができるので、 単純に // と書くことが多いです。

//の後ろに、オプションを指定できます。

i ・・・ 大文字と小文字を区別しません。
文字列の中の特定の文字列を別の文字列に置換するには → s//

デフォルト変数 $_ を対象に、特定の文字列を別の文字列に置換するには次のようにします。

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 にそこから後ろが全て入ります。

考察

習うより慣れろ

正規表現というのは、「習うより慣れろ」という感じがします(^^;

shift_jisの時、困ることが・・・

置換処理をしたいとき、置換したい文字列が全角文字だったりすると、意図したように動作しないことがあります。 これは全角文字の2バイト目にある\とか@とかが悪さをするためです。 解決するにはshift_jis以外の文字コードを使うか、index関数を使うかといったことが必要になります。

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。