[Perl][正規表現][NoEditor(鬼車)] alt 指定のないimg タグを洗い出す方法

こんにちは、harupiyo です。

正規表現を書く時に、中にalt を含まないimg タグを探すにはどうしたらよいのだろう?と思って調べてみました。
Perl の場合と、正規表現ライブラリ"鬼車" を使っているNoEditor の場合で試してみています。


詳説 正規表現 第3版

詳説 正規表現 第3版

(ひさしぶりに読んだ...)


正規表現のパターンの中に、(?!alt)と記述すると、altを含まない場合という指定ができます。

Perl の場合

#!/usr/bin/perl

# 検索対象文字列
$str = <<EOF;
<img src="test.jpg"><img src="test2.jpg" alt="hello"><img src="test3.jpg">
<img src="test.jpg" alt="">                       
<img src="test.jpg" alt="test">
<img src="test.jpg" ALT="test">
EOF

$regexp = qr/
    (
        <img
            (?!         # 先読み条件指定開始,
                [^>]*       # > 以外の文字が続いて,
                alt="       # alt=" が来て
                [^"]        # すぐに" で閉じるのでない場合
            )           # はマッチ対象から除外する
            [^>]*       # 除外しない場合は、<img のあとに続く
        >               # > までの間の文字を
    )                   # $1 に保存する
/ix;                    # Option: i ... 大文字小文字を区別しない           
                        #       : x ... 正規表現中に# でのコメントをゆるす

# 上の正規表現は、こう一行で書いたのと同じです(どちらでも動きます)
$regexp = qr/(<img(?![^>]*alt="[^"])[^>]*>)/ix;                 

# マッチするパターンを全て表示(洗い出し)
while( $str =~ m/$regexp/g ){
    print $1 . "\n";
}

__END__
実行結果:
<img src="test.jpg">
<img src="test3.jpg">
<img src="test.jpg" alt="">

上のPerl のコードでは、正規表現にコメントを付けておきました。

NoEditor の場合

NoEditor(あるいはNoEditor 付属のYokkaGrep) でも同じことが実行できました。


以上、ご参考になさってください。