正则表达式限制在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)
干杯!