電子書籍の厳選無料作品が豊富!

HTMLで、開始 < と終了 > に囲まれた特定の文字列を別の文字に書き替えたいのですが、思う通りに動かなくて困っており、質問させていただきます。

例えば以下の2行のHTMLがあったとします。
 <font color="red">赤は英語でredです。</font>
 <span style="color:red;">赤は英語でredです。</span>

このHTMLで、タグの属性として使われている「color="red"」と「style="color:red;"」の部分だけ「red」を「black」に変更したいのです。
(文字列として使われている「英語でredです」の部分はそのまま)

秀丸やさくらエディタで正規表現を使って検索すると、
<.+?red.+?>
で検索できましたがJavaでは検索ができません・・・。

コード:
String strHtml = "<html><body><font color=\"red\">赤は英語でredです。</font><span style=\"color:red;\">赤は英語でredです。</span></body></html>";
Pattern pattern = Pattern.compile( "<.+?red.+?>", Pattern.DOTALL ); // 正規表現で検索
Matcher matcher = pattern.matcher( strHtml );
while( matcher.find() ){
System.out.println( "res=" + matcher.group( 0 ) );
}

出力結果:
res=<html><body><font color="red">
res=</font><span style="color:red;">
res=<html><body><font color="red">赤は英語でredです。</font><span style="color:red;">赤は英語でredです。</span></body></html>

エディタと同じように<font color="red">と<span style="color:red;">が取りたいのですが・・・、考え方もしくは正規表現が間違っているのでしょうか?
お分かりの方がいましたら御助力いただけたら助かります。
よろしくお願いします。

A 回答 (1件)

知っていいるわけではなくプログラムの動作からの類推になってしまうのですが・・・



A.+?B

最短一致パターン .+? は後続するパターンBの出現でマッチする文字列をそれ以上延ばさないという意味だけれども、最短一致パターンの前にあるAについて最後に出現したAの位置からマッチさせるという意味はないようですね。
よって最後に出現したAからマッチさせたい場合は最短一致パターンに依存しない別の方法を使う必要があるのだと思います。今回の例だと最短一致パターンの前は固定文字'<'なので'<'以外の文字の繰り返しというふうに記述するとエディタに指定したパターンと同様の意味のマッチングができるようです。

"<[^<]+red.+?>"
"<[^<]+?red.+?>"

(本件の場合はどちらでも結果は変わらないと思います。)

本来はどのような仕様なのかAPI Documentに書いてある文献『Mastering Regular Expressions, 3rd Edition』(Jeffrey E. F. Friedl 著、O'Reilly and Associates、2006 年) をみるべきなのでしょうが・・・すみません。持ってないのでみてません。
    • good
    • 0
この回答へのお礼

教えていただいた正規表現を使ったところ正常に検索できました!
心から感謝します。
有難うございました。

お礼日時:2014/09/30 20:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!