|
||||
|
|
8章 正規表現
|
|
|
正規表現とは
正規表現とは文字列の一部をパターン化して記述する表現方法の事になります。例えば、「*」を任意の文字列、「?」を任意の 1文字として表す事が出来ます。 もとは UNIXの awkなどのテキストフィルタで用いられていましたが、Perlではとても強力な正規表現をサポートしています。
vb.txt perl.txt c.txt java.txt これらをまとめて以下のように表現できる。
*.txt
上の例では [ *.txt ] が左の4つの文字列を表わす正規表現となります。 またこのように正規表現で表現出来る事をマッチすると言います。 メタキャラ
上の例で出てくる [ . ] はメタキャラと呼ばれるものです。 このメタキャラは正規表現では一つで英数字を表現したり、または英数字以外を表現したりとても重要な役割を持っています。 これから代表的なメタキャラの使用法を見ていきます。 下に [ メタキャラ一覧表 ] もありますので参照して下さい。
任意の一文字 【 "." 】
改行文字を除く任意の1文字 [ 表現 ]
windows..
[ 結果 ]
windowsNT # 全てマッチ windows98 # 全てマッチ windows3.1 # windows3.までマッチ くり返し表現 【 " * " , " ? " , " + " 】
前で説明した任意の1文字では上の全てをマッチする事は出来ませんでした。しかしこれから説明する繰り返し表現を使用する事により、ある文字や文字列の繰り返しという複雑な表現をする事が出来ます。 " * "前にある文字の0回以上の表現 [ 表現 ]
12*
[ 結果 ]
1222222222 # 全てマッチ 1 # 0回もマッチ " ? "前にある文字の0,1回の表現 [ 表現 ]
12?
[ 結果 ]
1222222222 # # 12のみマッチ 1 # 0回もマッチ " + "前にある文字の1回以上の表現 [ 表現 ]
12+
[ 結果 ]
1222222222 # 全てマッチ 1 # 0回なのでマッチしない Perlでは通常で最長マッチとなります [ 表現 ]
12+
[ 結果 ]
1222222222 # 全てマッチ 量指定のメタキャラに"?"を付加する事によって最小マッチとなる [ 表現 ]
12+?
[ 結果 ]
1222222222 # 2桁目までマッチ 指定内の任意の表現 【 " [ ] " 】
任意の二つの文字にマッチさせたい時や、複数の文字の中のいずれかにマッチさせたいと言った場合は " [ ] " で複数の候補を指定する事ができます。 下記のように指定することで、 a 又は b でマッチします。 [ a 又は b にマッチする ]
[ab]
小文字アルファベットであればマッチする表現を考えてみてください。 [ ] を使えば、 [abcd...z] で表現する事が出来ます。 しかし実際これでは非常長い表現になってしまい使い勝手が悪く、さらにはスペルミスも起こしかねません。 こんな時のために、「 小文字のアルファベット全て」 といった表現や、「 数値全て 」といった表現を省略して簡単に使う事が出来ます。(下図参照)
これまで紹介した例はある文字を一つを表現する方法でした。 下記のサンプルは 1文字だけではなく 文字列を表現する方法です。 文字列は [ | ] で区切って表現します。 [ 表現 ]
(this|that) is sample
[ 結果 ]
this is sample 又は that is sample にマッチします。 回数指定の表現
今まで見てきたメタキャラでは 0回以上や 1回以上といった指定しか出来ませんでした。 この様な場合 perlでは なるべくたくさんマッチしようとする [ 最長マッチ ] になりますが、?回にマッチや任意の数以上にマッチさせる回数指定の方法を見てみます。
[ 表現 ]
#[aaa] のみにマッチ a{3} #[aaa] , [aaaaaaaa] など3回以上連続する [a] にマッチ a{3,} 位置の指定 【 [^] [$] 】
今回は〜から始まる単語、〜で終わるといった単語のの表現方法になります。 〜から始まる単語という表現は単語の初めに [ ^ ] を付けます。 逆に 〜で終わっている単語と言う表現は、単語の最後に [ $ ] を付けます。 [ 表現 ]
#"abc"で始まっていたら ^abc #"abc"で終わっていたら abc$ [ 使用例 ]
W.*[T8]$ Windows 95 # マッチしない Windows 98 # マッチ Windows NT # マッチ 上記の正規表現は先頭が [ W ] で始まっていて最後が [ T ] 又は [ 8 ] で終わっていると言うことを表現しています。 そのため上の3つのサンプルでは先頭は全て [ W ] から始まっているので当てはまります。 しかし 最後が [ T ] 又は [ 8 ] と言う条件を "Windows 95" だけ満たしていませんのでマッチしないという訳です。
( 注1 デフォルトでは、数量子を付けたサブパターンは、「最長一致」となります、これは残りのパターンがマッチしなくならない範囲で、できる限り多くのものにマッチすると言う事です。つまり、標準の数量子は、すべて「最長一致」で、パターンが失敗しない範囲で可能な限り長い範囲にマッチさせます。 もし、最短の範囲でマッチさせたい時は、数量子の後に " ? "を付けると「 最短一致 」にする事が出来ます。( 意味自体は変りません ) Perlでの利用法検索
特定の語句が含まれているか確認する
ここまで説明してきた正規表現を利用しマッチする語句が含まれているか調べるには次のような記述になります。 文字列にパターンマッチする語句が含まれていれば [ 真 ] となる値を、含まれていなければ [ 偽 ] となる値を返します。
文字列 =~ /PATTERN/
[ 使用例 ]
if ( $sample =~ /hello/ ) { print '変数に文字列 "hello"は含まれています。' ; } else { print '変数に文字列 "hello"は含まれていません。' ; } 特定の語句が含まれていないか確認する
また上記のサンプルとは逆に、文字列にパターンマッチする語句が含まれていなければ[ 真 ] となる値を、含まれていれば [ 偽 ] となる値を返すように記述する事も出来ます。
文字列 !~ /PATTERN/
$_ を使ったマッチング
省略する事により特殊変数 [ $_ ] が使用されます
if (/hello/ ) { print '特殊変数 $_に文字列 "hello"は含まれています。' ; } else { print '特殊変数 $_に文字列 "hello"は含まれていません。' ; } 置換え 【 s// 】
検索だけでなく正規表現にマッチした語句を指定した語句へ置換えます。 下記では変数の内容で [ PATTERN ] にマッチした語句を [ CHANGE ] で指定した語句へ置換します。
変数 =~ s/PATTERN/CHANGE/
省略する事により特殊変数 " $_ "が使用されます。
$_ = "Hello World Hello world" ; s/Hello/Good/ ; print ; 上記のサンプルは [ Good World Hello world ] と表示されます。デフォルトの置換えでは最初にマッチした語句のみの置換えになります。全ての語句を置換したい時は後述するオプションをつける事によって実現します。 オプションg オプション (繰り返し)
マッチを文字列の中で可能な限りPerlで検索を行いマッチさせます。 [ 表記 ]
s/PATTERN/CHANGE/g
[ 使用例 ]
$tmp = "Hello World Hello world" ; $tmp =~ s/Hello/Good/g; print $tmp ; これは [ Good World Good world ] と表示されます。オプションを指定しないと最初に見つかった語句だけの置換でしたが、オプションを指定した事によってマッチする全ての語句の置換になりました。 i オプション(大文字、小文字の区別)
デフォルトのパターンマッチングでは大文字、小文字は異なる文字として区別されます。 そんな時に i オプションを付けると 大文字、小文字も同一の文字として扱うことが出来ます。 [ 表記 ]
/PATTERN/CHANGE/i
[ 使用例 ]
$sample = "Hello" ; if ( $sample =~ /^[a-z]/ ) { print "オプション指定しない" ; } if ( $sample =~ /^[a-z]/i ) { print "オプション指定" ; } これは [ オプション指定 ] と表示されます。 先頭が大文字なので i オプションを付けなければ [ オプション指定しない ] と表示されますが、オプションによって 大文字、小文字を区別しないように指定したために 2回目の if文で真となります。 eオプション(置換え後の評価)
[ 表記 ]
s/PATTERN/CHANGE/e
[ 使用例 ]
$_ = 'ab12cd ' ; s/\d+/$&*2/e ; eオプション付加をつけると[ ab24cd ] に変更されます。オプションをつけなければ [ ab12*2cd ] のように変更されます。 "( )"による記憶
オプションとは呼びませんが、、、パターンマッチングを行なうときに " () " を指定してマッチした項目は、正規表現内やその後で特殊変数によるアクセスが可能になります。 [ 終了後の参照 ]
$_ = "text=This Is sample" ; /(.+)=(.+)/ ; print "First = $1 \n" ; print "Second = $2 \n" ; 上記を実行すると [ First = text 改行 Second = This Is sample ] と表示されます。 マッチングの時に()で括った箇所にマッチした語句を、その後特殊変数 $1, $2 を使ってアクセスしています。 [ 正規表現内での参照 ]
if ( /^(.)\1+$/ ) { print "Match" ; } else { print "Not Match" ; } 今度のの例では、ある文字が 2文字以上続いていればマッチして、それ以外であればはマッチしません。 先頭の文字を()で括り、直後に [ \1 ] を用い参照しています。 このように同一の表現の中でも () を使った記憶を使用する事が出来ます。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||