TopProgramming LanguagePerl正規表現 > 2013年11月
2013年11月28日

正規表現の最短マッチと最長マッチについて

November 28,2013 1:55 AM
Tag:[]
Permalink

正規表現の最短マッチと最長マッチについて紹介します。

最短マッチ

1.問題点

次のようなHTML文書があると仮定します。

<div>aaa</div>
<div>bbb</div>
<div>ccc</div>

この文書からHTMLタグだけを取り除くために、Perlで次のように書いてみます。

#!/usr/bin/perl
 
use strict;
 
my $foo = <<EOF;
<div>aaa</div>
<div>bbb</div>
<div>ccc</div>
EOF
 
$foo =~ s/<.+>//g;
print $foo;

このスクリプトを実行すると、何も出力されません(厳密には改行文字が出力)。

2.最長マッチについて

1項で何も表示されない原因は、s///演算子による正規表現で「最長マッチ」を適用しているためです(赤色部分 )。

$foo =~ s/<.+>//g;

サンプルの「.+(1回以上の繰り返し)」、あるいは「.*(0回以上の繰り返し)」は最長マッチとなり、Perlであればデフォルトのパターンマッチになります。

つまり上記のように記述すると、各行頭の「<」と、マッチが可能な最後尾の文字、つまり行末の「>」にマッチします(下の赤色部分)。

<div>aaa</div>
<div>bbb</div>
<div>ccc</div>

3.最短マッチについて

サンプルで「aaa」などのテキスト部分のみを残すには、HTMLタグの「<」のあとで最初に出現する「>」、つまり最短マッチさせる必要があります。

最短マッチさせるには、次のように「?」を加えます。

$foo =~ s/<.+?>//g;

「?」は量指定子を示すものではなく、量指定子の直後に指定することで最短マッチを示す役割を果たします。

上記のように記述することで、以下の赤色部分がマッチするようになります。

<div>aaa</div>
<div>bbb</div>
<div>ccc</div>

修正したスクリプトは以下のとおりです。

#!/usr/bin/perl
 
use strict;
 
my $foo = <<EOF;
<div>aaa</div>
<div>bbb</div>
<div>ccc</div>
EOF
 
$foo =~ s/<.+?>//g;
print $foo;

これで次のような出力を得ることができます。

aaa
bbb
ccc

2014.2.18
説明に誤りがあったので修正しました。

Comments [2] | Trackbacks [0]
Now loading...
Recent Entries
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2021年
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3