2012-01-19 28 views
2

我已經編譯了一個AIX盒子上的紅寶石64位。 似乎沒有任何問題,除非我在我的代碼中使用一些特定的正則表達式。 下面是一個例子:紅寶石64位aix彙編的正則表達式限制

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

結果:

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

當我試圖減少重複次數,它似乎工作。

我試着深入研究Ruby代碼。但不明白原因。 這是AIX/64位ruby中的一些依賴或限制嗎?

感謝提前:)

回答

1

我幾乎立刻就找到了答案。

我做的第一件事是在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 

發現我不知道這三個正在使用(最有可能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」。儘管如此,這並不總是好事 - 最好讓配置腳本爲CFLAGS派生自己的值... – graza

+0

@graza當常量在多個頭文件中定義時,問題就會到來。哪個先到先得。這可能不受CFLAGS控制,因爲標題可能包含在其他標題和內容中!無論如何感謝這條信息! :) – Ricketyship