正则表达式限制在ruby 64位aix编译中

我在AIX Box上编译了ruby 64位。 除非我在代码中使用某些特定的正则表达式,否则似乎没有任何问题。 这是一个例子:

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

结果是:

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

当我尝试减少重复次数时,它似乎有效。

我试着深入研究ruby代码。 但无法理解原因。 这是我们在AIX / 64位ruby中的一些依赖或限制吗?

提前致谢 :)

我几乎马上就找到了答案。

我做的第一件事是在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中重新分配RE_DUP_MAX的值来解决该问题

 # ifdef RE_DUP_MAX # undef RE_DUP_MAX # endif # define RE_DUP_MAX ((1 << 15) - 1) 

干杯!

Interesting Posts