- - PR -
Jakarta OROについて
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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でこのような現象は起こりうるのでしょうか? |
|
投稿日時: 2008-01-12 10:11
> ちなみに、2行目を以下のようにすると正常に動作します。
しかしこれは、要求と違う、ということでしょうか? ここに記述されている処理の、要求を明白に説明してみてください。 なお、バックトラックを行う不定量指定(*, +, ?など)の正規表現が複数個、OR演算子'|'で羅列されていると、マッチしない対象文字列に対してStackOverflowErrorになることはざらにあります。いわゆる順列組み合わせで、バックトラックのための記憶項目数が爆発的に増えるためです。具体例はSunのBugParadeに数多くあります。要求を明白に絞り込めば、より経済的で効率的な正規表現を使えると思います。(現在のIMG_TAG_REGEXPの定義は、なんだかおかしい…<imgがあって\\s+までは分かりますが、そのあとが、きわめてヘン) |
|
投稿日時: 2008-01-12 13:22
ご回答ありがとうございます。
>なお、バックトラックを行う不定量指定(*, +, ?など)の正規表現が複数個、OR演算子'|' >で羅列されていると、マッチしない対象文字列に対してStackOverflowErrorになることはざ >らにあります。いわゆる順列組み合わせで、バックトラックのための記憶項目数が爆発的に >増えるためです。具体例はSunのBugParadeに数多くあります。 こういうことが起こりうるんですね。 正規表現を工夫してみます。 アドバイスありがとうございました。 |
1