|
|
Perl正規表現の使い方 位置の指定 |
H.Kamifuji . |
位置を指定しない場合にはパターンが対象の文字列のどの位置に現れてもマッチします。逆に文字列の先頭にある場合や末尾にある場合などパターンが現れる位置を指定することも可能です。ここではパターンの位置を指定方法を確認します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 |
|
指定したパターンが文字列の先頭にある場合だけマッチするようにするにはメタ文字の1つである「^」を使います。(メタ文字とはパターンの中で記述可能な特別な意味を持つ文字のことです)。 書式は次の通りです。 /^パターン/具体的な例で考えてみます。「abcdef」と「feabc」と言う2つの文字列に対してパターンを「/abc/」と指定した場合にはどちらの文字列にも「abc」は含まれているため、どちらもマッチします。 my $str = "feabc"; if ($str =~ /abc/){ print "文字列に「abc」を含みます\n"; }これに対してパターンを「/^abc/」と記述した場合は、文字列の先頭に位置に「abc」がある場合だけマッチします。よって「abccdef」はマッチしますが「feabc」はマッチしません。 my $str = "feabc"; if ($str =~ /^abc/){ print "文字列の先頭に「abc」を含みます\n"; }メタ文字「^」を使用することで文字列の先頭から指定した文字が含まれている場合だけマッチさせるパターンを記述することが出来ます。 メタ文字「^」「^」は文字列の先頭を表しています。つまり「^abc」は「文字列の先頭」+「a」+「b」+「c」と言う4つの連続する単語から出来ているパターンと考える事が出来ます。そこでパターンの中で単独で「^」を記述する場合を考えてみます。 if ($str =~ /^/){ # ... }メタ文字「^」は先頭の文字ではなく文字列の先頭を表すものですので、あらゆる文字列にマッチします。なぜならば全ての文字列には文字列の先頭があるためです。 では簡単なプログラムで確認して見ます。 test1-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 文字列の先頭(^) use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $str = "homepage"; print "対象:$str\n"; if ($str =~ /^home/){ print "文字列の先頭に「home」を含みます\n"; }else{ print "文字列の先頭に「home」を含みません\n"; } $str = "my home"; print "対象:$str\n"; if ($str =~ /^home/){ print "文字列の先頭に「home」を含みます\n"; }else{ print "文字列の先頭に「home」を含みません\n"; }上記を「test1-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Anchor]$ perl test1-1_u.pl | nkf -w 対象:homepage 文字列の先頭に「home」を含みます 対象:my home 文字列の先頭に「home」を含みません [xxxxxxxx@dddddddddd Anchor]$ |
指定したパターンが文字列の末尾にある場合だけマッチするようにするにはメタ文字の1つである「$」を使います。 書式は次の通りです。 /パターン$/具体的な例で考えてみます。「abcdef」と「feabc」と言う2つの文字列に対してパターンを「/abc/」と指定した場合にはどちらの文字列にも「abc」は含まれているため、どちらもマッチします。 my $str = "abcdef"; if ($str =~ /abc/){ print "文字列に「abc」を含みます\n"; }これに対してパターンを「/abc$/」と記述した場合は、文字列の末尾に「abc」がある場合だけマッチします。よって「feabc」はマッチしますが「abcdef」はマッチしません。 my $str = "abcdef"; if ($str =~ /abc$/){ print "文字列の最後に「abc」を含みます\n"; }メタ文字「$」を使用することで文字列の最後の位置に指定した文字が含まれている場合だけマッチさせるパターンを記述することが出来ます。 メタ文字「$」「$」は文字列の末尾を表しています。つまり「abc$」は「a」+「b」+「c」+「文字列の末尾」と言う4つの連続する単語から出来ているパターンと考える事が出来ます。そこでパターンの中で単独で「$」を記述する場合を考えてみます。 if ($str =~ /$/){ # ... }メタ文字「$」は先最後の文字ではなく文字列の末尾を表すものですので、あらゆる文字列にマッチします。なぜならば全ての文字列には文字列の末尾があるためです。これはメタ文字「^」の場合と同じです。 では簡単なプログラムで確認して見ます。 test2-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 文字列の末尾($) use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $str = "homepage"; print "対象:$str\n"; if ($str =~ /home$/){ print "文字列の最後に「home」を含みます\n"; }else{ print "文字列の最後に「home」を含みません\n"; } $str = "my home"; print "対象:$str\n"; if ($str =~ /home$/){ print "文字列のhomeに「home」を含みます\n"; }else{ print "文字列のhomeに「home」を含みません\n"; }上記を「test2-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Anchor]$ perl test2-1_u.pl | nkf -w 対象:homepage 文字列の最後に「home」を含みません 対象:my home 文字列のhomeに「home」を含みます [xxxxxxxx@dddddddddd Anchor]$ |
メタ文字は単独で使用するだけではなく複数のメタ文字を併用して使用することが出来ます。そこで文字列の先頭にマッチする「^」と文字列の最後にマッチする「$」を合わせて使ってみます。 /^パターン$/メタ文字を除くパターン部分が単純な文字列だった場合、文字列の先頭から始まり文字列の末尾で終わっていることになりますので、結果的にパターン部分で指定した文字列と完全に一致する場合にだけマッチします。 my $str = "abc"; if ($str =~ /^abc$/){ print "文字列は「abc」です\n"; }上記のようにパターンが「/^abc$/」の場合は「文字列の先頭」+「a」+「b」+「c」+「文字列の末尾」と言う5つの連続する単語(正確には「^」や「$」は文字にマッチするものではありませんが)から出来ているパターンと考える事が出来ます。 では簡単なプログラムで確認して見ます。 test3-1.pl サンプルプログラム下記のサンプルを実行してみよう。# 先頭と末尾を合わせて指定 use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $str = "homepage"; print "対象:$str\n"; if ($str =~ /^home$/){ print "「^home\$」にマッチします\n"; }else{ print "「^home\$」にマッチしません\n"; } $str = "my home"; print "対象:$str\n"; if ($str =~ /^home$/){ print "「^home\$」にマッチします\n"; }else{ print "「^home\$」にマッチしません\n"; } $str = "home"; print "対象:$str\n"; if ($str =~ /^home$/){ print "「^home\$」にマッチします\n"; }else{ print "「^home\$」にマッチしません\n"; }上記を「test3-1.pl」の名前で保存してから次のように実行して下さい。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Anchor]$ perl test3-1_u.pl | nkf -w 対象:homepage 「^home$」にマッチしません 対象:my home 「^home$」にマッチしません 対象:home 「^home$」にマッチします [xxxxxxxx@dddddddddd Anchor]$ |
|
|