2012-01-19 11 views
2

私はAIXボックスにルビ64ビットをコンパイルしました。 私のコードで特定の正規表現を使用する場合を除いて、問題はないようです。ルビの正規表現の制限64ビットのaixのコンパイル

RegexpError: too big quantifier in {,}: /([0-9]*){1000}/ 

私は繰り返しの回数を減らしてみてください、動作しているようです:中

/([0-9]){1000}/.match("2") 

結果: はここでの例です。

私はルビーコードを掘り下げようとしました。しかし、理由を理解できませんでした。 これはAIX/64ビットのルビに依存しているのですか?

ありがとうございます。

答えて

1

私はすぐに答えを見つけました。

私が最初にしたことは、投げられているエラーのルビーソースコードを検索することでした。私は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.h すなわち

# ifdef RE_DUP_MAX 
# undef RE_DUP_MAX                        
# endif 

# define RE_DUP_MAX ((1 << 15) - 1) 

乾杯でRE_DUP_MAXの値を再割り当てすることによって解決しました!

+0

さて、あなたは確かにRubyの人々にパッチを提出する必要があります!当然、システムのRE_DUP_MAXを使用するつもりでない限り...(また、チェックマークを使用して質問に回答することをお勧めします) –

+0

私は以前同様の問題を抱えており、見つかったのと同じ原因を発見しました。私の場合、CFLAGSに「-DRE_DUP_MAX = 32767」を追加しました。 configureスクリプトがCFLAGSの独自の値を導き出すのが良いとは限りません。 – graza

+0

@graza定数が複数のヘッダファイルで定義されている場合、問題が発生します。どちらが先に来るかが決まります。ヘッダーは他のヘッダーや要素に含まれる可能性があるため、これはCFLAGSによって制御されない場合があります。とにかく情報のためのおかげで! :) – Ricketyship

関連する問題