4

REXMLRubyパーサーを使用してXMLファイルを解析しています。しかし、64ビットRubyを搭載した64ビットAIXボックスでは、次のエラーが発生します。

REXML::ParseException: #<REXML::ParseException: #<RegexpError: Stack overflow in 
regexp matcher: 
/^<((?>(?:[\w:][\-\w\d.]*:)?[\w:][\-\w\d.]*))\s*((?>\s+(?:[\w:][\-\w\d.]*:)?[\w:][\-\w\d.]*\s*=\s*(["']).*?\3)*)\s*(\/)?>/mu>

同じことを求めるのは次のようなものです。

REXML::Document.new(File.open(actual_file_name, "r"))

誰かがこの問題を解決する方法についてアイデアを持っていますか?

4

2 に答える 2

6

私はほとんどすぐに答えを見つけました。

私が最初にしたことは、スローされたエラーを ruby​​ のソース コードで検索することでした。これは regex.h が原因であることがわかりました。

regex.h では、コード フローは次のようになります。

/* Maximum number of duplicates an interval can allow.  */
#ifndef RE_DUP_MAX
#define RE_DUP_MAX  ((1 << 15) - 1)
#endif

ここでの問題は RE_DUP_MAX です。AIX ボックスでは、同じ定数が /usr/include のどこかに定義されています。私はそれを検索し、見つけました

/usr/include/NLregexp.h
/usr/include/sys/limits.h
/usr/include/unistd.h

3 つのうちどれが使用されているかはわかりません (おそらく NLregexp.h)。これらのヘッダーでは、RE_DUP_MAX の値が 255 に設定されています。したがって、正規表現の繰り返し回数には上限があります。

要するに、その理由は、コンパイルが、regex.h で定義した値よりもシステム定義の値を取るためです!

これは、私が最近尋ねた私の質問にも答えます: Regex limit in ruby​​ 64 bit aix compilation

100以上の評判が必要なので、すぐには答えられませんでした:D:D 乾杯!

于 2012-01-19T11:09:04.483 に答える