[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
2部 Perl言語仕様

正規表現

正規表現の概要

正規表現は、Perlの中で最も重宝する機能のひとつです。正規表現にはテキスト処理のための様々な機能があり、文字列の中から特定のパターンを見つけ出したり、置換したりすることができます。

正規表現の基本的な使用方法

たとえば、$strという変数に格納したデータの中から、「A」で始まって途中は何があるかわからないが最後が「E」という文字列を探したい場合、次のように記述することで、条件にマッチする文字列を見つけることができます。

$str =~ /A.*E/;

上記では、ドット( . )が改行以外の1文字を表し、アスタリスク( * )がその任意の文字の0回以上の繰り返しを意味します。このように、正規表現において特殊な働きを持った文字を正規表現演算子、またはメタ文字と呼びます。また、=~ はパターン結合演算子と呼ばれ、「左辺の値から右辺の値を検索する」という意味があります。

正規表現の構文

パターンマッチ演算子

VALUE =~ /PATTERN/gimosx

正規表現は、左辺の VALUE に格納されている文字列から右辺のPATTERN がマッチするかをチェックします。VALUE のなかに PATTERN がマッチすれば 1(TRUE)を返し、マッチしなければ "" (FALSE)を返します。通常、VALUEには変数を指定しますが、指定しない場合はデフォルトで特殊変数 $_ の値が使われます。
正規表現の最後に付加している g、 i、 m、 o、 s、 xはオプションです。これらは必要に応じて使うことができます。

次の例では、変数 $methodに格納された文字列から大文字の「GET」と小文字の「get」を探します。正規表現の最後にある iオプションは、大文字・小文字を区別しないように指示しています。

$method =~ /GET/i;

正規表現の構文と、演算子については、m演算子で詳しく説明しています。

パターンマッチ演算子の否定形

VALUE !~ /PATTERN/gimosx

この構文は構文1とは逆に、VALUE に PATTERN がマッチしない場合に 1 (TRUE)を返し、マッチすれば "" (FALSE) を返します。

置換演算子

VALUE =~ s/PATTERN/REPLACE/egimosx

置換演算子の構文は s/PATTERN/REPLACE/ となっています。この s 演算子は、指定されたPATTERN を見つければ、それを REPLACE で置き換えます。

変数を使ったパターン

PATTERNには、変数が含まれていてもよく、パターンが評価されるごとに変数が展開されます。特殊変数の$) と $|は文字列の終わりを調べるパターンであると解釈されるので、展開されません。

/<IMG $atr>/;

正規表現のメタ文字

正規表現で特に重要なのがメタ文字です。正規表現のメタ文字はその文字自体を表すものではありません。メタ文字を使うと、「行頭にあるパターンだけを探す」、「英数字を探す」、「大文字または小文字で始まるパターンだけを探す」など、さまざまな方法で検索パターンを指定することができます。
メタ文字の逆の意味を持つのがリテラルで、正規表現で特殊な意味がなく、表記どおりの文字列として扱われます。

正規表現のメタ文字の一覧
メタ文字 説明
\ 直後の文字をエスケープする

\
を使って後続の文字をエスケープすると、メタ文字をリテラルとしてマッチさせることができます。

. ワイルドカード。改行文字を除く任意の1文字にマッチ

ただし、後述するパターンマッチ修飾子 /s が使われる場合は改行も含めて全てにマッチします。

[a-z0-9] [ ]の中の任意の1文字にマッチ
(例では、小文字または数字の任意の1文字)

文字の間にハイフン( - )を挟み、文字列の範囲を表すことができます。たとえば、[12345]の様に規則的に連続した文字列は、[1-5] と表記できます。

[^a-z0-9] [ ]の中にない任意の1文字にマッチ
(例では、小文字または数字以外の任意の1文字)

チルダ( ^ )は必ずパターンの先頭に置きます。 先頭以外にある ^ はリテラルと解釈されます。

\d 数字の1文字にマッチ

[0-9] と同じです。

\D 数字以外の1文字にマッチ

[^0-9] と同じです。

\w アルファベットまたは数字(単語)の1文字にマッチ

[a-zA-Z_0-9] と同じです。

\W アルファベットと数字以外(単語以外)の1文字にマッチ

[^a-zA-Z_0-9] と同じです。

\s 空白文字にマッチ

スペース、タブ、改行になります。[ \n\r\f\t] と同じです。

\S 空白文字以外にマッチ

[^ \n\r\f\t] と同じです。

A|B|C 選択一致パターン
(例では、A、B、Cのいずれか1つの文字にマッチ)

| の前後あるどちらかの正規表現にマッチします。

(x) 文字列をグループ化

カッコ内のパターンにマッチした文字列は記録されます。

(?:...) 後方参照を行わないグループ化

\1 や \2 を使用した後方参照が出来ません。

\1 または $1 グループ化にマッチした文字列を参照

文字にマッチさせる

Aで始まり、その後に任意の2文字が続いた後、Dが続くパターン

/A..D/

123で始まり、後に1文字の数字が続くパターンを検索

/123\d/

選択パターン

a 、 b 、 c のどれかにマッチ

$s =~ /a|b|c/

選択一致パターン | を [...] で囲むと文字として判断されてしまうので、注意してください。

$s =~ [a|b|c]; # 「a|」 という文字列にマッチしてしまう

文字集合

[...]は、文字の集合を表し、そのうちのどれか1文字にマッチすれば TRUEを返します。文字や数字の範囲を示したいときはハイフン( - )が使えます。

/[0-9]/ # 数字1文字とマッチ
/[a-zA-Z]/ # 大文字・小文字を含めた英字1文字とマッチ

文字集合の中に、ハイフン( - )そのものを含めたい場合は、その前に逆スラッシュ( / )をおいて次のように書きます。

/[a-z\-]/ # 小文字のアルファベットかハイフンにマッチ

1、2、3のいずれでもない文字で始まるパターンを検索

/[^123]/

0から9までの数字1文字で始まり、次に1文字の「.」が続いてもよいパターンを検索(「?」は直前の文字が0個または1個ある事を表す)。

/[0-9]\.?/

文字列のグループ化と後方参照

カッコは、文字や正規表現をグループにまとめます。また、グループにマッチした文字列は記録され、特別な変数によって参照することができます。これを後方参照といいます。参照の仕方は、カッコで囲んだグループの左から順に、\1、\2、\3... となります。

たとえば、「<b>Attension!</b>」のようなHTMLタグにマッチさせるには次のようになります。

m|<(.*?)>.*?</\1>|

もしタグが<b>であれば、(.*?) の部分に b がマッチし、\1 は bの値になります。その場合は「<b>任意の文字列</b>」というパターンにマッチします。タグが <html>であれば、「<html>任意の文字列</html>」となります。

正規表現の外部では、特殊変数を使って $1、 $2、$3... で参照できます。

$str = "Now I know His strength is within me";
$str =~ /^(\w+)/; # 先頭の単語にマッチ
print $1, "\n"; # マッチした値を表示
>Now

マッチ変数

後方参照の変数には上記のほかに、マッチ変数 $& $` $' $+があります。これらの変数を使うとプログラム内のすべての正規表現の処理が遅くなるので、注意して使ってください。

マッチ変数の一覧
メタ文字 説明
$& 文字列の中でパターン全体がマッチした部分を参照
$` 文字列の中でマッチに先行する部分を参照
$' 文字列の中でマッチに続く部分を参照
$+ 最後にマッチした文字列を返す
マッチ変数の使い方
# 最後にマッチしたワードを配列に格納
while ( /\w+/g ){ push( @words, $& ) }

選択一致パターンとグループ化の組み合わせ

選択一致パターンの | は、文字列のグループ化と組み合わせて使うと効果的です。たとえば、Windows Me か Windows Xp という単語を探したい場合は、次のように書くことができます。

/Windows (Me|Xp)/

ただ、グループ化すると自動的に後方参照用に記憶されるので、多少ではありますが処理が遅くなります。これを避けるには、後方参照を行わないグループ化の構文「(?:...)」を使います。

/Windows (?:Me|Xp)/ # マッチしたデータは記憶されない

量指定子

量指定子は、その直前の要素が何回マッチするかを指定します。たとえば、「a*」は0個以上の aにマッチします。

量指定子の一覧
メタ文字 説明
x? 0個または1個の x にマッチ
x* 0個以上の x にマッチ
x+ 1個以上の x にマッチ
x{m,n} m 個以上、n 個以下の x にマッチ

次のような使い方があります。

{m} m 回の繰り返しにマッチ
{m,} m 回以上の繰り返しにマッチ
{m,n} m 回以上、n 回以下の繰り返しにマッチ

量指定子は可能な限り長いマッチを行います。次の例は、「care」と「me」に挟まれた単語を探したい場合の、間違った例です。

$str = "care for me, care for me";
$str =~ /care.*me/;

「.*」にマッチするのは「 for 」ではなく、「 for me, care for」までがマッチしてしまいます。

可能な限り短いマッチを行いたい場合は、量指定子と組み合わせて、最短マッチのメタ文字を使うことができます。使い方は、量指定子の後にクエスチョン( ? )を追加します。

*? +? ?? {n}? {n,}? {n,m}?

これでようやく、「care」と「me」に挟まれた単語を探すことができます。

$str =~ /care.*?me/;

量指定子の後にクエスチョン( ? )があるので、最短マッチが行われ「 for 」がマッチします。

基本的な繰り返しパターン検索
/A?/ # 0個、または1個以上の A にマッチ
/A*/ # 0個以上の A にマッチ
/A+/ # 1個以上の A にマッチ
/.?/ # 0個、または1個以上の任意の文字にマッチ
/.*/ # 0個以上の任意の文字にマッチ
/.+/ # 1個以上の任意の文字にマッチ
a が少なくとも1回、最大でも3回繰り返すパターンを検索
/a{1,3}/
a が3回繰り返すパターンを検索
/a{3}/
a が少なくとも1回以上続くパターンを検索
/a{1,}/

アンカー

アンカーは、行頭や行末など、文字列中の位置にマッチします。行頭を表す ^ と行末を表す $はおぼえておいたほうがよいでしょう。

アンカーの一覧
メタ文字 説明
^ 行頭
$ 行末
\A 文字列の先頭
\b ワードの区切り

ここでのワードとは、英数字とアンダースコア( _ )です。

\B ワードの区切り以外
\G 文字列の先頭、もしくは修飾子 g
がついたパターンマッチングが終了した場所を記憶しておき、そこにマッチ
\Z 文字列の最後

\A と ^ 、\Z と $ は機能がよく似ているので注意してください。複数の行がある文字列を対象に正規表現を行った場合、^は改行の直後にもマッチしますが、\A は文字列の先頭にしかマッチしません。
\Z と $ の関係も \A と ^ に似ています。$ は改行の直前にもマッチしますが、\Zは文字列の最後にしかマッチングしません。

 \b は、ワード境界とマッチします。ワード境界とは、\w と \Wの間を指します。利便性のため、文字列の先頭と末尾もワード境界とされます。

/\bLauryn\b/

 上記の正規表現は、「Lauryn hill」にはマッチしますが、「Laurynhill」にはマッチしません。

行頭のAを検索
/^A/
行末のZを検索
/Z$/

$ は、改行の直前と文字列の末尾にマッチします。次のような正規表現は、改行を取り除いて出力します。

print "This is it, Ground zero.\n" =~ /(.*)$/;

正規表現のエスケープシーケンス

メタ文字をエスケープする

ドメインには、メタ文字のドット( . )が含まれているので、エスケープ処理が必要になります。メタ文字をエスケープするには、エスケープしたいメタ文字の直前に \ を置きます。

/rfs\.jp/

正規表現では以下のエスケープシーケンスが使えます。

エスケープシーケンスの一覧
メタ文字 説明
\a アラーム
\c 制御文字
\e エスケープ文字
\f 改ページ (form feed)

ASCII での \x0c を表します

\n 改行 (newline)

ASCII での \x0x を表します

\r 復帰文字 (return)

ASCII での \x0d を表します

\t タブ (tab)

ASCII での \x09 を表します

\0 ヌル文字
\12 8進数の ASCII 値にマッチ
\x811 16進数の ASCII 値にマッチ

スペースのメタ文字

タブを検索

/\t/

テキスト修飾子

テキスト修飾子は、大文字や小文字、または小文字から大文字への変換をしながらマッチングさせることができます。

テキスト修飾子の一覧
メタ文字 説明
\E 大文字、小文字変換の終了
\l 次の文字を小文字に変換
\L \E までを小文字に変換
\Q \E までのパターン指定メタ文字の意味を打ち消す
\u 次の文字を大文字に変換
\U \E までを大文字に変換

\L は \E までの文字を小文字に変換、\U は\E までの文字を大文字に変換させます。

/\Ugained/ # GEINED にマッチ
/\LGAINED/ # gained にマッチ
/\Ug\Eained/ # Gained にマッチ

\l は次にくる文字を小文字に、\u は次に来る文字を大文字に変換します。

/\ugained/ # Gained にマッチ
/\lGAINED/ # gAINED にマッチ

\Q は \E までの正規表現メタ文字をエスケープ処理します。カッコ、アスタリスク( * )、ドット(
. )などのメタ文字を、リテラルとして解釈させたいときに有効です。\Q
を使えば、正規表現上の表記をスッキリさせることができるので、オススメです。メタ文字を使わない正規表現を書くときは、積極的に使用するといいでしょう。

/\Qrfs.jp/ # rfs.jp にマッチ

ワード境界の罠

空白文字の集合を表す \s 、ワードの集合を現す \w 、ワードの境界を表す \b の組み合わせには十分な注意が必要です。

次の正規表現は、後ろに空白文字が続くワードを拾おうとしています。一見、まともな正規表現に見えますね。

/(\w+)\s+/;

「It is funny」というような文字列でしたら問題ないのですが、「It's funny」というようにワード以外を含んだ文字列にはマッチしません。「It's」のシングルクォートの箇所がワードの区切りとなり、空白文字の直前にある「s」しか取り出せません。正解は次のようになります。

/(\S+)\s+/;

このように、なるべく、\s の次には \S を続けるように注意しましょう。

パターンマッチ演算子

m// 演算子

m// 演算子は、パターンマッチで文字列検索を行ないます。スカラコンテキストでは、マッチするごとにTRUE を返し、最終的にマッチしなくなったときに FALSEを返します。対象の文字列を変更すると、検索位置は先頭にリセットされます。=~ 演算子か !~ 演算子で検索対象の文字列を指定しなかったときは、$_ が検索対象となります。

区切文字が "/" のときには、最初の m を省略することができます。m を付けるときには、英数字でも空白でもない、任意の文字のペアを区切文字として使うことができます。たとえば、パス名「/usr/local/bin/perl」など「/」を含む文字列の場合は、mオプションで区切り文字を変更すると文がすっきりとします。

m|/usr/local/bin/perl|

リストコンテキストでのパターンマッチ

パターンマッチが、リスト値が要求されるコンテキストで使われると、パターンの中のカッコで括られた部分にマッチしたリストを返します。マッチしたリストは、左から順に$1、$2、$3...と参照できます。マッチが失敗した場合には、空配列が返されます。マッチが成功した場合で、カッコが無い場合には、リスト値が返されます。

( $s1, $s2, $s3 ) = ( /^(\S+)\s+(\S+)\s*(.*)/ )

リストコンテキストにおける正規表現

リストコンテキストでは、マッチした値のリストを返し、マッチが失敗したら、空のリストを返します。

$_ に格納された文字列から日付部分のみを取り出す
($year, $month, $day) = /(\d+)-(\d+)-(\d+)/;

map の中でマッチを使うとさらに強力です。

# @date から ^Date:\s+(.*) のパターンにマッチする要素を取り出す
($date) = map{ /^Date:\s+(.*)/ } @date;

m// 演算子のオプション

m// 演算子のオプションの一覧
オプション 意味
g 繰り返してマッチ
i 英字の大文字、小文字を区別しない
m 文字列を複数行として扱う
o PATTERNの評価を 1回だけにする
s ワイルドカードのドット( . )が改行にもマッチするようにする
x 拡張正規表現を使用する

g オプション-繰り返してマッチ

繰り返してマッチを行います。

カッコを含んだ検索パターン

カッコを含んだパターンの場合、マッチした全パターンに含まれる全ての部分文字列をリストにして返します。たとえば、変数$_ から VARIABLE=VALUE という対を全て取り出してハッシュに代入することができます。

%hash = /(\b\w+)=(\S*)/g;
配列でgオプションを指定

配列に g オプションを指定すると、マッチしたもの全てをリストにして返します。

push( @list, /\w+/g );
whileループの条件部に使う
while ( /\w+/g ){ push( @words, $& ) }

i  オプション-英字の大文字、小文字を区別しない

i オプション(Insensitive) は大文字と小文字を区別しないでマッチングしたいときに使います。

# "a" と "A" にマッチ
$s =~ /a/i;

m オプション-文字列を複数行として扱う

m オプションは、対象のパターンに改行が含まれていても、その改行にまたがってパターンを検索します。

# 文字列の途中に改行がある
$s = "With a gun barrel between you\n teeth, you speak only in vowels.";
# m オプションは複数行にまたがるパターンにもマッチする
$s =~ /you teeth/m;

o オプション-PATTERNの評価を 1回だけにする

oオプションは、対象となるパターンが変数を含んでいても、その変数は1回しか評価しません。これによって、実行時のパターンの再評価を避けることができます。

次の例は、ファイルから読み込んだ行に$argにセットされた文字列が含まれれば、その行を出力します。$argは変数というよりも、セットされた文字列として評価されます。

while( $s = <FH> ){
	# 一度だけ展開する
	if ( $s =~ /$arg/o; ){ .... }
}

s オプション-ワイルドカードのドット( . )が改行にもマッチ

ワイルドカードのドット( . )が改行にもマッチするようにします。

# 文字列の途中に改行がある
$s = "With a gun barrel between you\n teeth, you speak only in vowels.";
# ワイルドカードが改行にもマッチする
$s =~ /you.teeth/s;

x オプション-拡張正規表現を使用する

x オプションは、PATTERN 内のスペースを無視して、コメントを使えるようにします。

# C言語のコメントにマッチ
$s =~ m{
	/\* # 開始区切り文字にマッチ
	.*? # 最短一致でマッチ
	\*/ # 終了区切り文字にマッチ
}x;

m//

置換演算子

s/// 演算子

s演算子は置換処置に使います。検索文字 PATTERNを使ってパターンを検索し、もし見つかれば、置換文字 REPLACE
で置き換え、置換した数を返します。見つからなければ、FALSE を返します。=~ 演算子などによって文字列が指定されていなければ、$_ が使われます。

スラッシュ( / )の区切り文字以外にも、英数字、空白ではない任意の文字が使えます。シングルクォート( ` )を使うと置換文字列での展開はされません。バッククォートを使うと、置換文字列をコマンドとして実行して、その出力が実際の置換文字列に使われます。PATTERNをカッコ類で括った場合には、REPLACE 用にもう一組の区切り文字を用意します。

# スラッシュ( / )以外の区切り文字を使う
$path =~ s|/usr/bin|/usr/local/bin|;
# カッコ類も可
$path =~ s(/usr/bin)(/usr/local/bin);

PATTERN や REPLACE の文字列に変数を含めると、文字列として展開されます。

$num = '[0-9]+';
$str = "test 1 2 3";
$str =~ s/$num//gxo;
print $str, "\n";
> test
s/// 演算子の応用

g オプションを使って繰り返し置換

s/<[^>]+>/ /g;

置換した値を他の変数に代入

$str = "if you aint runnin game.\n";
($str2 = $str) =~ s/aint/are not/;
print $str, $str2;
> if you aint runnin game.
> if you are not runnin game.

マッチしたパターンの順番を入れ替える

$str = "back Looking";
$str =~ s/([^ ]*) *([^ ]*)/$2 $1/; # 最初の 2 語の入れ替え
print $str, "\n";s
> Looking back

s/// 演算子用のオプション

s/// 演算子用のオプション一覧
オプション 意味
e 式の右側の評価を行なう
ee 式の右側の評価を行い、実行後の戻り値を再度評価する
g 繰り返し置換
i 大文字、小文字を区別しないで検索
m 文字列を複数行として扱う
o パターンの評価を 1 度だけにする
s ワイルドカードのドット( . )が改行にもマッチするようにする
x 拡張正規表現を使用する

e オプション-REPLACE を式として評価

e オプションは置換文字列を式として解釈し、eval します。

s/\d+/sprintf("%02d",$&)/e; # マッチした文字列を sprintf で整形
s/^=(\w+)/&func($1)/e; # サブルーチン呼び出しを使う

その他のオプションについては m// 演算子を参照してください。

tr/// 演算子

tr/// 演算子は検索文字列 SEARCH に含まれる各文字を、置換文字列 REPLACE
にマッチする文字に1文字ずつ変換します。REPLACEを省略すると、マッチした文字は削除されます。この関数は変換、もしくは削除した文字数を返します。置換文字列が検索文字列より短い場合、対応する文字がない時は置換文字列中の最後の文字に置き換えられます。

tr/// 演算子の変わりに y/// 演算子を使うこともできます。

tr/// 演算子のオプションの一覧
オプション 意味
c 検索リストに指定された文字以外を検索
d 置換されなかった文字を削除
s 置換後の文字が重複している場合は削除して1つにつめる

tr/// の一般的な使い方

$str =~ tr/A-Z/a-z/; # 小文字に統一

tr は変数を展開しません。変数を使いたい場合には、eval() を使います。

eval "tr/$search/$replace/, 1" or die $@;

c オプション(Complement)

cオプションは、検索文字列以外の文字を検索します。つまり、最初に指定する文字列に含まれていない文字を置換文字列の文字に変換します。

# 0から9以外の文字列を*に変換
tr/[0-9]/*/

s オプション(Squeeze)

s オプションは、検索文字列の文字が連続して複数個見つかった場合、それらを1文字に置き換えます。

# 複数の「A」を1つの「A」に変換
tr/A/A/s

d オプション(Delete)

d オプションは、検索文字列の文字のうち置換文字列には含まれない文字をすべて削除します。

tr/// 演算子の様々な使い方
$w = 'BOOK@RFS.JP';
$w =~ tr/A-Z/a-z/; # 小文字に正規化
print $w,"\n";
> book@rfs.jp
$cnt = $w =~ tr/././; # $w に含まれる . の数を数える
print $cnt,"\n";
> 1
$w =~ tr/a-zA-Z/ /cs;  # 英字以外をスペースに変換
print $w,"\n";
> book rfs jp
$w =~ tr/a-zA-Z//s; # 連続した単語をひとつにまとめる
print $w,"\n";
> bok rfs jp

s///
tr///

拡張構文

Perlの正規表現には、拡張構文があります。 正規表現の演算子は、その正規表現内すべての文字列に適用されますが、拡張構文を使用すると、正規表現内で自由に正規表現演算子の機能を振り分けることができます。

拡張構文は、開きカッコと閉じカッコの間に、先頭の文字として疑問符 ( ? )
を置いたものです。その疑問符の次の文字により、拡張構文の機能が決まります。

拡張構文の一覧
メタ文字 説明
(?# コメント) 正規表現内にコメントを入れる際に使います。

シャープ(#)以降の文字列はコメントとして解釈され、マッチングの対象から外れます。

(?:...) ( ... ) と同様にグループ化します。ただし、後方参照用の記録をしません。
(?=式) 前方一致検索です。
たとえば、 /\w+(?=\t)/
は、単語に続いてタブがあるものにマッチしますが、$& にはタブは含まれません。
(?!式) 後続の文字列が式に一致しなければマッチします。
たとえば、/\w(?!\t)/ は、単語の後ろにタブがないものにマッチします。
(?ismx) 正規表現内にパターンマッチ修飾子を埋めみます。
部分的に「大文字小文字の区別を行う」などの指定に役立ちます。部分的にパターンマッチ就職子の効果を与えたいとき、その部分の前に指定します。たとえば、
/O(?i)ne/ は、One 、ONE など、O に続く文字 er
の大文字小文字を区別しません。(?i)修飾子の働きをオフにしたい場合は (?i‐...)
のように、‐ "ダッシュ"記号をつけます。
(?<=式) 後方一致検索

先行する文字列が式に一致すればマッチします。

(?<!式) 後方一致検索の否定形

先行する文字列が式に一致しなければマッチします。

正規表現のテクニック

正規表現を速くするコツ

正規表現はとても複雑ですから、最適な方法を見つけるのがとても大変です。まずは、次の注意点だけを気をつけるようにして、一日も早く正規表現の世界に慣れましょう。

  • 正規表現内に変数がある場合、/o オプションを使って1度だけ評価するように指示する
  • マッチ変数を使わない($` $& $')
  • 選択パターン | の使用を避ける
    /a|b|c/ の代わりに /[abc]/ が使えます。
  • メモリを使わないカッコ(?:...)によって高速化(多少)
    /(?:\w+)/ など

正規表現を使わない

シンプルな文字列操作の多くは、正規表現よりも index、rindex、substr、tr///などの専用の演算子の方が適しています。

.. if $method =~ /^GET$/; # 遅い・・・
... if $method eq "GET"; # 同じ意味ですが、高速です

文字列の一部を抜き出すには substr が適切です。

$str = "We've accomplished";
print $str =~ /^.{6}(.{12})/, "\n"; # 遅い・・・
> accomplished
print substr($str, 6, 12), "\n"; # 速いし読みやすい
> accomplished

ついでに、substr は左辺に置くと置換に使えます。

$str = "He has a dryer.\n";
substr( $str, 9, 5) = "gun in his pocket";
print $str
>He has a gun in his pocket.

s/// 演算子の代わりに tr/// を使う

s/// 演算子は決めの細かい置換が行えますが、文字数の計算や、重複する文字の削除は tr/// のほうが高速です。

数字の桁数を数える

$cnt = tr/0-9//; $_ 数字の桁数を数える。

ウインドウズファイルをUNIX形式に変換

$_ = "-------\r\nTEST\r\n-------\r\n";
tr/\r//d; # \r を削除

tr///

半角数字をチェックする

変数の中がすべて半角の数字かどうかをチェックするには、次のようにします。

$str =~ /[0-9]+/

文字列の末尾が改行かをチェックする

改行コードはオペレーティングシステムによって違います。UNIX 系 OS の改行は \n、ウインドウズは \r\n 、マッキントッシュは \r が使われています。次のコードはどの環境の改行コードにもマッチします。

$str =~ /[\r\n]/

関連記事