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

时间:2012-01-19 10:50:00

标签: ruby-on-rails ruby 64-bit aix

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

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

结果:

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

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

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

提前致谢:)

1 个答案:

答案 0 :(得分: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中重新分配RE_DUP_MAX的值来解决该问题 即

# ifdef RE_DUP_MAX
# undef RE_DUP_MAX                                                                                            
# endif

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

干杯!