メタキャラクタ

メタキャラクタとは、そこに書かれてある文字(キャラクタ)とは異なる意味を表す文字(キャラクタ)のことです。「\w」は、普通は円記号(本来はバックスラッシュ)と文字wを表しますが、正規表現では、大文字・小文字のアルファベットか、0から9までの数字のいずれか一文字を表します。このように、特殊な働きをするものをメタキャラクタと呼びます。

位置指定(アンカー指定)

位置指定のメタキャラクタは、ヌル文字にマッチするので、捕捉できません。

^ (キャレット)
1.行頭を表す

テキスト:
 she is beautiful.
 is she beautiful?
regexp:
 /^she/
1行目のsheのみにマッチ

2.文字クラス内で否定を表す

[^a] ... 「a」以外の任意の1文字

$ (ドル)
1.行末を表す

テキスト:
 mypicture.jpg
 jpg-viewer
regexp:
 /jpg$/
1行目のjpgのみにマッチ

注.Perlでは、$はスカラー変数を表すのにも用いられます。

\b
単語の境界を表す

テキスト:
 look
 looked
regexp:
 /\blook\b/
1行目のlookのみにマッチ

\B
単語の境界以外を表す

繰り返しパターン

Perlは、基本的には、指定された繰り返しパターンが最大になるようにマッチします。

? (クエスチョンマーク)
直前の文字の0回、または1回の繰り返し

テキスト:
 ask
 asks
regexp:
 /asks?/
両方にマッチ

* (アスタリスク)
直前の文字の0回以上(0から無限大の範囲)の繰り返し

テキスト:
 ask
 asks
 askssss
regexp:
 /asks*/
すべてにマッチ

+ (プラス)
直前の文字の1回以上(1から無限大の範囲)の繰り返し

テキスト:
 ask
 asks
 askssss
regexp:
 /asks+/
2番目と3番目にマッチ

{min,max} (繰り返し数指定)
直前の文字のmin回からmax回までの繰り返し

テキスト:
 ask
 asks
 askssss
regexp:
 /asks{2,4}/
3番目にマッチ
regexp:
 /asks{4}/
3番目にマッチ
  これは、ある回数を1つだけ指定する方法です
regexp:
 /asks{,4}/
すべてにマッチ
  これは、最大繰り返し数だけ指定する方法です(0回〜最大数)

注意:Perlでは、{と}の中に空白文字(スペースなど)を挿入してはいけません。

単一の文字や数字

. (ピリオド、ドット)
任意の一文字にマッチ
通常は、改行以外の全ての文字にマッチしますが、Perlでは改行にもマッチさせることができます。

テキスト:
 bananas
 bananas
 bananas
regexp:
 /.a./
上記のようにマッチ。通常は1度マッチすると検索が終了するので、1番目の結果だけが返されます。

[ ] (角括弧、ブラケット)
[と]の中に記述された文字のうちのいずれかにマッチ

テキスト:
 bananas
 bananas
 bananas
regexp:
 /[a]/
上記のようにマッチ。通常は1度マッチすると検索が終了するので、1番目の結果だけが返されます。

テキスト:
 bananas
regexp:
 /b[a]/
上記のようにマッチ。bの後にaが来るものだけ。

テキスト:
 bananas
 bananas
 bananas
regexp:
 /a[a-z]/
上記のいずれかにマッチ。通常は1度マッチすると検索が終了するので、1番目の結果だけが返されます。
「-」は、角括弧内で用いられると、範囲指定を表すメタキャラクタとして扱われます。[a-z]は、小文字のaからzまでのうちの1文字とマッチします。

テキスト:
 bananas
 bananas
regexp:
 /a[^s]/
上記のいずれかにマッチ。通常は1度マッチすると検索が終了するので、1番目の結果だけが返されます。
「^」は、角括弧内で用いられると、否定を表すメタキャラクタとして扱われます。[^s]は、小文字のs以外の任意の1文字とマッチします。

\w
アルファベットの任意の一文字にマッチ
アルファベットとは、大文字、小文字のアルファベットの他に、数字とアンダーバー(アンダースコア;_)を含みます。[a-zA-Z0-9_]に等価です。

\W
アルファベット以外の任意の一文字にマッチ

\d
数字の任意の一文字にマッチ
0から9までの数字のいずれか一文字にマッチします。[0-9]に等価です。

\D
数字以外の任意の一文字にマッチ

空白文字

空白文字とは、半角スペース、タブ、改ページ、改行、復帰の5つの文字コードを表します。[(半角スペース) \t\f\n\r]に等価です。

\s
任意の空白文字一文字にマッチ

テキスト:
 He looked at the picture.
 Helooked closely at the picture.
regexp:
 /looked\sat/
1番目にマッチ

\S
任意の空白文字以外の一文字にマッチ

\t
タブ(一文字)にマッチ

\n
改行(一文字)にマッチ
改行は、使用システムによって実際の値が変わります。異機種間にまたがるデータ処理では注意が必要です。
UNIX...LF(/\x0A/)
Mac...CR(/\x0D/)
Windows...CR+LF(/\x0D\x0A/)

\f
フォームフィード(一文字; /\x0C/)にマッチ

\r
キャリッジリターン(一文字; CR; UNIX&Win.../\x0D/ Mac.../\x0A/[LF])にマッチ

グループ化

( ) 丸括弧
ある正規表現の有効範囲を明示的に記述します。また、Perlでは、(と)でくくられたグループを$1などの特殊な変数内に捕捉します。

テキスト:
 look
 looked
 looking
 looks
regexp:
 /look(ed)?\b/
上記1番目と2番目だけにマッチ

選択(OR)

|
|の前後に指定された文字(列)のいずれかの文字(列)

テキスト:
 look
 looked
 looking
 looks
regexp:
 /s|p/
4番目だけにマッチ
regexp:
 /ke|ks/
2番目と4番目にマッチ
regexp:
 /look|looks|looked|looking/
すべてにマッチ。ただし、全ての場合において先頭から4文字目(look)しか捕捉されない。
regexp:
 /looking|looked|looks|look/
すべてにマッチ。文字長の大きいものから記述すると、全てを捕捉する。
regexp:
 /look(ing|ed|s)?/
すべてにマッチ。上記例よりも速い。

範囲指定

[x-y]
[ ]内では、前後に指定された文字の範囲を表します。このようにして表された文字の集合を、文字クラスといいます。-は、これ以外はハイフンにマッチします。

regexp:
 /[a-z]/ ... 小文字のアルファベット
 /[A-Z]/ ... 大文字のアルファベット
 /[A-C]/ ... 大文字のアルファベットA, B, Cのいずれか
 /[A-Ca-c]/ ... 大文字のアルファベットA, B, Cのいずれか、または小文字のアルファベットa, b, cのいずれか
 /[-A-C]/ ... Perlでは、大文字のアルファベットA, B, Cのいずれか、またはハイフンにマッチ

制御文字

\a
ビープ(BEL; /\x07/)にマッチ

[\b]
文字クラス内での\bは、バックスペース(/\x08/)にマッチ

\e
エスケープ(ESC; /\x1B/)にマッチ

\0
ヌル文字にマッチ

\cX
任意の制御文字一文字にマッチ
キーボードの「Ctrl」+「任意の一文字」に対応

8進数・16進数

\10
8進数は、\に続いて数値を記述

\x1A
16進数は、\xに続いて数値を記述

メタキャラクタのエスケープ

\
メタキャラクタの前に\を置くことで、特殊な意味を持たせないようにします。

テキスト:
 \100
regexp:
 /\/
何にもマッチしないし、エラーも出ない。
regexp:
 /\\/
円記号(\)にマッチ

テキスト:
 $100
regexp:
 /$/
行末にマッチしているだけで、何も捕捉できない。
regexp:
 /\$/
ドル記号($)にマッチ

テキスト:
 and/or
regexp:
 ///
エラー
regexp:
 /\//
スラッシュ(/)にマッチ

先読み

ある正規表現に続く、テキストの右側の位置を先に検査します。テキストの左側を検査するもの(後読み)はサポートされていません。

(?=) 肯定先読み
テキストの右側にある表現を先に捕捉します。その条件に合った場合のみマッチします。その値は格納されません。

テキスト:
 I look for him.
 I look at him.
regexp:
 /look(?=\sfor)/
1番目の「look」とマッチ

(?!) 否定先読み
テキストの右側にある表現を先に捕捉します。その条件に合わない場合のみマッチします。その値は格納されません。

テキスト:
 I look for him.
 I look at him.
regexp:
 /look(?!\sfor)/
2番目の「look」とマッチ

Perlの拡張メタキャラクタ

注)先読みも、現在の所拡張メタキャラクタの1つです。バージョンによっては、動作しない機能が多く含まれています。

(?#コメント)
正規表現内にコメントを入れることができます。

regexp:
 /look(?=\sfor)/
 /look(?=\sfor)(?#searching look for)/
上記2つは同じ結果を返します。

(?:)
グループ化の( )と同じですが、$1等の変数にその値を格納しません。

\A
文字列の先頭を表します。通常は「^」の方を用います。

\G
g修飾子と併用するときにのみ有効となります。\Gは前に正規表現のマッチが終了した位置にマッチします。

\L〜\E
\Lから\Eまでの間にある文字を、小文字に変換します。

\l
\lの次の文字1文字を、小文字に変換します。

\Q〜\E
\Qから\Eまでの間に指定された文字は、すべて通常の文字として扱われます。メタキャラクタは、その意味を失います。

\U〜\E
\Qから\Eまでの間に指定された文字は、すべて大文字に変換されます。

\u
\uの次の文字1文字を、大文字に変換します。

\Z
文字列の末尾を表します。通常は「$」の方を用います。

(?i)
パターンマッチの修飾子iを正規表現中に埋め込みます。修飾子iは、大文字・小文字を問わずマッチさせるとき用います。

(?m)
パターンマッチの修飾子mを正規表現中に埋め込みます。

(?s)
パターンマッチの修飾子sを正規表現中に埋め込みます。

(?x)
パターンマッチの修飾子xを正規表現中に埋め込みます。修飾子xを指定すると、空白文字が読み飛ばされるようになります。また、正規表現中に「#」で始まるコメント行を入れることもできるようになります。

最短一致する繰り返しのメタキャラクタ

注)これらは、繰り返しのメタキャラクタと「?」の組み合わせで表現されていますが、「?」本来の意味は失われ、1組で別の働きをするよう設計されています。

*?
0回以上の繰り返し。この意味では「*」と同等ですが、最短一致します。

テキスト:
 aaabbbcc
regexp:
 /aaab*?/ -> aaa
 /aaab*/ -> aaabbb  

+?
1回以上の繰り返し。この意味では「+」と同等ですが、最短一致します。

テキスト:
 aaabbbcc
regexp:
 /aaab+?/ -> aaab
 /aaab+/ -> aaabbb  

??
0回または1回の繰り返し。この意味では「?」と同等ですが、最短一致します。

テキスト:
 aaabbbcc
regexp:
 /aaab??/ -> aaa
 /aaab?/ -> aaab  

{n}?
n回の繰り返し。この意味では「{n}」と同等です。最短一致しますが、通常は変わりません。  

{min,}?
min回以上の繰り返し。この意味では「{min,}」と同等ですが、最短一致します。

テキスト:
 aaabbbcc
regexp:
 /a{1,}/ -> aaa
 /a{1,}?/ -> a  

{min,max}?
min回以上max回以下の繰り返し。この意味では「{min,max}」と同等ですが、最短一致します。

テキスト:
 aaabbbcc
regexp:
 /a{1,3}/ -> aaa
 /a{1,3}?/ -> a  


捕捉した結果を格納する変数

Perlでは、マッチした文字列を格納する特殊な変数があります。これらはPerl独特のスカラー変数と呼ばれる変数です。変数の頭に「$」がついていることが特徴です。

(文字列)後方参照に使う
$1()で囲まれた最初の集合
$2()で囲まれた2番目の集合 ... 以下$9まで
$&最後のパターンマッチングでマッチした文字列
$`最後のパターンマッチングでマッチしたものに先攻する文字列
$'最後のパターンマッチングでマッチしたものに後続する文字列
$+最後のパターンマッチングでマッチしたパターン


正規表現の記法

正規表現は通常「/」で区切ります。
例:/abc/

パターン照合演算子

変数 =~ /文字列/ ... 変数に文字列が含まれているか
変数 !~ /文字列/ ... 変数に文字列が含まれていないか

--
例1

$mojiretsu = "Hello world";
if ($mojiretsu =~ /or/) {	#もし$mojiretsuに/or/が含まれていれば
  print "yes\n";		#yesと表示
} else {			#含まれていなければ
  print "no\n";			#noと表示
}
出力:yes
--
例2
$mojiretsu = "Error messages are more informative, and the optional warnings will catch many of the mistakes a novice might make.";
if ($mojiretsu =~ /optional/) {
  print "$`     $&     $'\n";
} else {
  print "No such strings.\n";
}
出力:Error messages are more informative, and the      optional      warnings will catch many of the mistakes a novice might make.
--

s演算子

構文:s/old/new/
働き:文字列「old」を文字列「new」に置き換える
   このままだと、最初にマッチした文字列を1度置き換えるだけ。すべてを置き換えるにはgオプションを使います。また、大文字・小文字を無視する場合はiオプションを指定します。
例:
$moji1 = "Hello";
$moji3 = $moji2 = $moji1;
$moji1 =~ s/e/@/;
print $moji1,"\n"; #出力→ H@llo
$moji2 =~ s/l/L/;
print $moji2, "\n"; #出力→ HeLlo
$moji3 =~ s/l/L/g;
print $moji3, "\n"; #出力→ HeLLo
$moji2 =~ s/l/9/ig;
print $moji2,"\n"; #出力→ He99o

tr関数

構文:tr/パターン1/パターン2/
働き:パターン1の各文字をパターン2の対応する各文字に置き換える。
   s演算子と根本的に違うのは、1文字単位で置き換えることです。
例:
$moji1 = "Hello";
$moji3 = $moji2 = $moji1;
$moji2 =~ tr/el/89/;
print $moji2,"\n"; #出力→ H899o
$moji3 =~ tr/A-Z/a-z/; #A-Zは、大文字のAからZまでの26文字を表す
print $moji3, "\n"; #出力→hello
$moji3 =~ tr/a-z/A-Z/;
print $moji3, "\n"; #出力→HELLO


data