特殊文字は、パターンマッチングを行うために使用される。
|
表1
表 記 |
意 味 |
リンク |
.(ドット) |
\n以外の任意の1文字 |
|
[・・・・・] |
・・・・・中の一文字 |
3 |
[^・・・・・] |
^・・・・・中にない一文字 |
3 |
^ |
行頭 |
5 |
$ |
行末 |
5 |
$1..$9.. |
グループにマッチした部分 |
13 |
$& |
正規表現にマッチした部分全体 |
13 |
$+ |
最後のグループにマッチした部分 |
13 |
$` |
マッチした文字列より前の部分 |
13 |
$' |
マッチした文字列より後の部分 |
13 |
\A |
文字列先頭 |
|
\Z |
文字列末尾 |
|
\G |
m\\gの開始位置 |
14 |
\b |
単語境界 |
5 |
\B |
単語以外 |
5 |
\w |
英数字と_ |
3 |
\W |
英数字と_以外 |
3 |
\s |
空白文字 |
3 |
\S |
空白文字以外 |
3 |
\d |
0...9 |
3 |
\D |
0...9以外 |
3 |
\1,\2,・・・・ |
後方参照 |
9 |
\Q・・・\E |
・・・中のメタ文字を無効にする |
|
\x |
エスケープシーケンス |
2 |
* |
0回以上の繰り返し |
6 |
*? |
0回以上の繰り返し(最短一致) |
7 |
+ |
1回以上の繰り返し |
6 |
+? |
1回以上の繰り返し(最短一致) |
7 |
? |
0回又は1回の繰り返し |
6 |
?? |
0回又は1回の繰り返し(最短一致) |
|
{n,m} |
n回以上m回以下の繰り返し |
6 |
{n,} |
n回以上の繰り返し |
6 |
{n} |
n回の繰り返し |
6 |
{n,m}? |
n回以上m回以下の繰り返し(最短一致) |
7 |
(・・・・・) |
グループ |
9 |
| |
選択 |
8 |
(?:regexp) |
後方参照できないグループ |
9 |
(?=regexp) |
後方文字列をregexpにマッチさせる |
10 |
(?!regexp) |
後方文字列をregexp以外にマッチさせる |
10 |
(?x) |
xはimsxの並び、オプション指定 |
11 |
(?#・・・・) |
注釈 |
12 |
|
2.エスケープシーケンス
|
表1に上げた以外に「"・・・・・"」中で使えるエスケープシーケンスも全ての正規表現中で使う事が出来る |
|
表2
表記 |
意 味 |
\a |
アラーム(\x07) |
\b |
後退文字(\x08,[・・・・・]内のみ) |
\f |
改頁文字(\x0c) |
\n |
改行(x0a) |
\r |
リターン(\x0d) |
\t |
タブ文字(\x09) |
\ooo |
8進数表現 |
\xhh |
16進数表現 |
\cc |
コントロール文字 |
\0 |
ヌル文字 |
|
表記 |
意 味 |
\e |
エスケープシーケンス(\x1b) |
\' |
' |
\" |
" |
\$ |
$ |
\@ |
@ |
\\ |
\ |
\l |
続く文字を小文字にする |
\u |
続く文字を大文字にする |
\L |
\Eまでを小文字にする |
\U |
\Eまでを大文字にする |
\E |
\L,\Uの範囲の終わり |
|
3.一文字にマッチ
次の正規表現は、何種類かの文字のうち1文字にマッチする。
マッチする文字に - ,] を入れる場合は 「 \- 」「 \] 」と記載する。
集合体に入れる文字で^は最初以外の場所に記載する。
(1) 「
.」
(2) 「[・・・・・]」
|
「[ ]」で囲まれた部分に記載の文字のどれか1つとおマッチする。
マッチさせたいもの |
記載方法 |
a , b , c , d , e , f , j , k , l , m |
[ab-fjk-m] |
数字と+、- |
[0-9+\-] |
各括弧文字 |
[\][(){}] |
数字と英小文字英大文字 |
[\da-zA-Z] |
|
(3)「[^・・・・]」
|
文字集合の最初の文字が「^」の場合、文字集合の補集合を表す。
記載の文字以外の文字にマッチする。
マッチさせたいもの |
記載方法 |
英数字以外の1文字 |
[^a-zA-Z0-9] |
][^以外の文字 |
[^][^] |
|
(4)短縮法
|
[・・・]記載例 |
短縮例 |
[a-zA-Z0-9] |
\w |
[^a-zA-Z0-9] |
\W |
[0-9] |
\d |
[^0-9] |
\D |
[\n\r\f\t] |
\s |
[^\n\r\f\t] |
\S |
|
|
複数の正規表現を連結した結果も性表現です。
結果の正規表現は、連結された各正規表現にマッチする文字列が連結された順番に出現する文字列にマッチする。
abc |
マッチ |
abc |
マッチしない |
axbxxxc |
a[bc][def] |
マッチ |
abd , abe , abf , acd , ace ,acf |
マッチしない |
abc , adb |
|
|
以下に示すメタ文字は、文字ではなく文字列の位置にマッチする。
^r |
行頭 (正規表現rで始まる行) |
r$ |
行末 (正規表現rで終わる行) |
\b |
単語の区切り |
\B |
単語の区切り以外 |
^Subject: |
マッチ |
行頭のSubject: |
/$ |
マッチ |
行末の/ |
\bcat\b |
マッチ |
独立した単語としてのcat |
マッチしない |
bobcat, concatenateの中に有るcat |
|
|
以下に、繰り返しを表現するメタ文字を示す。
r* |
正規表現r の0回以上の繰り返し |
r+ |
正規表現r の1回以上の繰り返し |
r? |
正規表現r の0回又は1回の繰り返し |
r{n,m} |
正規表現r のn回以上m回以下の繰り返し |
r{n,} |
正規表現r のn回以上の繰り返し |
r{n} |
正規表現r のn回の繰り返し |
これらの繰り返し指示するメタ文字は、直前の正規表現rにマッチする文字列の繰り返しにマッチする。
a* |
マッチ |
空白文字列, a , aa , aaa , ・・・・ |
a+ |
マッチ |
a , aa , aaa , ・・・・ |
マッチしない |
空白文字列 |
c[ad]+r |
マッチ |
car , cdr , cadr , cdar , caar ,・・・・ |
マッチしない |
cr |
繰り返しの対象部分は、直前の正規表現として成り立つ最小の正規表現だ。
通常文字あるは文字集合の後ろに「*」などを書いた場合は、その文字(文字クラス)の繰り返しと見なされる。
2文字以上の繰り返しを表現したいときには、繰り返しの部分を「( )」で囲ってグループ 9参照 にする。
au+ |
マッチ |
au , auu , auuu .・・・・ |
(au)+ |
マッチ |
au , auau , auauau .・・・・ |
[0-9]+ |
マッチ |
0 , 365 , 314 , ・・・・ |
「?」は0回または1回だけが許される繰り返しで、「?」は、パターン中に省略されもよい部分を指定するのに便利だ。
[0-2]?\d:[0-5]\d([ap]m)? |
マッチ |
1:30 , 23;59 , 14:20pm ,・・・・ |
You have (new )?n\mail\. |
マッチ |
You have mail. , You have new mail. |
繰り返しのメタ文字「*」,「+」,「?」はメタ文字「{ }」を使って「{0,}」, 「{1,}」,「{0,1}」と表現することもできる。
しかし「{n,m}」にあまり大きな数を指定すると、パターンマッチが遅くなったりメモリが大量に必要になる。 |
7.最短繰り返し
|
前節で説明したメタ文字は全て最長部分にマッチする。
つまり、マッチ部分を可能な限り後方まで伸ばす。
例えば abXedcX に.*Xを照合させると abXedcX 全体にマッチする。
これに対して、Perlには最短一致と呼ばれる機能がある。
「*?」、「+?」、「??」、「{n,m}?」の4つは、意味は「?」なしのものと同じだが、最短部分にマッチする。
たとえば、「adXedcX」に「.*?X」を照合させると、「adX」部分にマッチする。
この機能の利用例を考えて見る。
例えば「<<」と「>>」で囲まれた文字列を探し出す正規表現はどう書けば良いでしょうか?
「<<.*>>」と書くと、例えば次のような文字列をパターンマッチした時に誤動作する。
<<abc>> and <<def>>
本当は「<<abc>>」という部分にマッチしてほしいはずが「<<.*>>」と書くと、文字列全体にマッチしてしまう。
このようなときに、「<<.*?>>」と書くと、望みとおりの結果がえられる。 |
|
正規表現の中で「または」を表現したいときには、(・・・・・・|・・・・・・)を使う。
a( new|n old)? pen |
マッチ |
a pen. a new pen. an old pen |
(fj|alt|comp)\.sources |
マッチ |
fj.sources. alt.sources. com.sources |
sapphire|ruby |
マッチ |
sapphre. ruby |
「( )」中の「|」で区切られた部分が選択肢です。
選択が正規表現全体であれば「()」を省略しても良い。 |
|
繰り返し単位あるいは選択を指示するために使った「( )」で囲まれた部分をグループと呼ぶ。
このグループにした正規表現にマッチした部分を後で参照する。
1つの正規表現に複数のグループが存在することがあるので区別するために「( )」の出現順に番号が付けられる。
Perlのパターンマッチではグループにした正規表現にマッチした文字列を変数$1,$2,・・・にパターンマッチごとに自動的に代入する。これらの変数の値はs///の置換文字列中あるは後続のスクリプト中でスカラ値として通常の変数と同様に参照することができる。
変数「$&」はパターンマッチの結果、正規表現にマッチした文字列全体を記憶する。
グループには正規表現中で「同じパターンの再出現」を表現できる
すでにマッチしたn番目のグループの内容を\nを使って参照する。これを後方参照と言う。
\nは対応する第nグループより後に書くこと。
([a-z]+)\1 |
マッチ |
auau , aaaa , hogehoge ,・・・・・ |
マッチしない |
auuu , aaaaa |
^--- (.*) \((\d)/\2\) ---$ |
マッチ |
--- line.lzh (123/123) --- |
|
10.後続文字列の指示
|
(?=regexp) |
後方文字列をregexpにマッチさせる |
(?!regexp) |
後方文字列をregexp以外にマッチさせる |
foo(?=bar) |
マッチ |
foobar , ・・・・(ただし$&はfoo) |
マッチしない |
foofoo, ・・・・ |
foo(?!bar) |
マッチ |
foofoo, ・・・・(ただし$&はfoo) |
マッチしない |
foobar , ・・・・ |
|
11.パターンマッチ修飾子の指示
|
m/foober/i は m/(?i)foobar/ と同じ
|
|
(?#comment-string)
abc(?# This is a comment.)def
abcdef
|
13.パターンマッチに関連する特殊変数
|
例1
1:"here (this that) where" =~ /(th.*)(th[a-z]+)+/;
2:print "\$1: <$1>, \$2: <$2>; \$&: <$&>\n";
3:print "\$+: <$+>, \$`: <$`>; \$': <$'>\n";
$1: <this >, $2: <that>; $&:<this that>
$+: <that>, \$`: <here (>, \$': <) where>
例2
1: "567" =~ /(\d)(\d)(\d)/;
2: {
3: "123" =~ /(\d)(\d)(\d)/;
4: print '($1,$2,$3)=', "($1,$2,$3)\n";
5: }
6: print '($1,$2,$3)=', "($1,$2,$3)\n";
($1,$2,$3)=(1,2,3)
($1,$2,$3)=(5,6,7)
|
14.m//:パターンマッチ
|
string = /PATTERN/
オプション |
意 味 |
g |
スカラコンテキスト:前回どこまでマッチを行ったかを保存する。次回この位置から検索を始める。
配列コンテキスト:グループにマッチした部分すべてを(global)リストにして戻す。 |
i |
大文字小文字の違いを(ignore)する。 |
o |
パターンのコンパイルを一度だけ(once)行う。 |
m |
文字列を複数行(multiple)をして扱う。 |
n |
文字列を単一行(single)をして扱う。 |
x |
空白類を無視する(文字集合中の空白類と「\」つきの空白類は有効 xはextended の略) |
|