PERL正規表現 ワード境界を表すメタ文字

HTML::TreeBuilderを使ってパースする時にはまったのでメモ。

 

my $article_body = $tree->look_down(_tag => 'div', class => 'article_body');

if ($article_body) {
  $content = $article_body->as_text;
}

 

 これでは期待通りの動作が出来なかった。

 

$article_body = $tree->find(_tag => 'div', class => 'article_body');

 

 これだと余計なものがかなり混入してくる。

 

$article_body = $tree->look_down(_tag => 'div', sub { $_[0]->attr('class') =~ /\barticle_body\b/ });

 

これでようやくうまく動作。

ポイントはメタ文字\b

 

/\barticle_body\b/

 

\b は、ワード境界を表す。
もうひとつの\bで挟むことにより、単独の単語として一致する。

 

つまり以下の時にマッチする。

<div class="article_body">...</div>
<div class="main article_body">...</div>
<div class="article_body post">...</div>

 

以下の時はマッチしない。

<div class="my_article_body">...</div>
<div class="article_body_class">...</div>

 

単独の単語の場合のみマッチし、部分文字列の場合はマッチしないので、class検索には必須かも。