Ограничение регулярных выражений в 64-битной компиляции ruby - PullRequest
2 голосов
/ 19 января 2012

Я скомпилировал ruby ​​64 bit на AIX Box.Кажется, нет никаких проблем, кроме случаев, когда я использую некоторые определенные регулярные выражения в моем коде.Вот пример:

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

приводит к:

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

Когда я пытаюсь уменьшить количество повторений, это похоже на работу.

Я попытался покопаться вкод рубинаНо не мог понять причину.Это какая-то зависимость или ограничение, которое мы имеем в AIX / 64-битном ruby?

Заранее спасибо:)

1 Ответ

1 голос
/ 20 января 2012

Я почти сразу нашел ответ.

Первым делом я искал в исходном коде 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!

Следовательно, проблема была решена путем переназначения значения RE_DUP_MAX в regex.h * 1015 т.е. *

# ifdef RE_DUP_MAX
# undef RE_DUP_MAX                                                                                            
# endif

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

Ура!

...