- PR -

Jakarta OROについて

1
投稿者投稿内容
たかし
常連さん
会議室デビュー日: 2004/10/15
投稿数: 27
投稿日時: 2008-01-12 01:13
お世話になっております。

jakarta-oro-2.0.8を使って、以下のように記述しています。

1. private final static String IMG_TAG_REGEXP = "/<img\\s+([^\"'>]*|\"[^\"]*\"|'[^']*')+>/mi";
2. String html = "<td><img src=\"http://google.co.jp/xxxx?param=\'1\'\"";
3. Perl5Util puTag = new Perl5Util();
4. PatternMatcherInput inputHtml = new PatternMatcherInput(html);
5. if(puTag.match(IMG_TAG_REGEXP, inputHtml)) {
6.     :
7. }

上記のような処理を実行すると、5行目でfalseが返ってくると想定していますが、5行目のmatchメソッドで、java.lang.StackOverflowErrorが発生します。

ちなみに、2行目を以下のようにすると正常に動作します。
 String html = "<td><img src=\"http://google.co.jp/xxxx?param=\'1\'\">";

原因の切り分け(Perl5Utilか、正規表現か)に困っています。
通常、Perl5Utilでこのような現象は起こりうるのでしょうか?
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-01-12 10:11
> ちなみに、2行目を以下のようにすると正常に動作します。
しかしこれは、要求と違う、ということでしょうか?
ここに記述されている処理の、要求を明白に説明してみてください。

なお、バックトラックを行う不定量指定(*, +, ?など)の正規表現が複数個、OR演算子'|'で羅列されていると、マッチしない対象文字列に対してStackOverflowErrorになることはざらにあります。いわゆる順列組み合わせで、バックトラックのための記憶項目数が爆発的に増えるためです。具体例はSunのBugParadeに数多くあります。要求を明白に絞り込めば、より経済的で効率的な正規表現を使えると思います。(現在のIMG_TAG_REGEXPの定義は、なんだかおかしい…<imgがあって\\s+までは分かりますが、そのあとが、きわめてヘン)
たかし
常連さん
会議室デビュー日: 2004/10/15
投稿数: 27
投稿日時: 2008-01-12 13:22
ご回答ありがとうございます。

>なお、バックトラックを行う不定量指定(*, +, ?など)の正規表現が複数個、OR演算子'|'
>で羅列されていると、マッチしない対象文字列に対してStackOverflowErrorになることはざ
>らにあります。いわゆる順列組み合わせで、バックトラックのための記憶項目数が爆発的に
>増えるためです。具体例はSunのBugParadeに数多くあります。

こういうことが起こりうるんですね。
正規表現を工夫してみます。
アドバイスありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)