Ограничение регулярных выражений в ruby ​​64-битной компиляции aix

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

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

приводит к:

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

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

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

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


person Ricketyship    schedule 19.01.2012    source источник


Ответы (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!

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

# ifdef RE_DUP_MAX
# undef RE_DUP_MAX                                                                                            
# endif

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

Ваше здоровье!

person Community    schedule 20.01.2012
comment
Что ж, тогда вы обязательно должны отправить патч ребятам из Ruby! Если, конечно, они не намерены использовать системный RE_DUP_MAX... (И вам, вероятно, следует также отметить ответ на вопрос, используя галочку.) - person Michael Ratanapintha; 20.01.2012
comment
У меня была аналогичная проблема некоторое время назад, и я нашел ту же причину, что и вы. В моем случае я добавил -DRE_DUP_MAX=32767 в CFLAGS. Однако это не всегда хорошо - лучше позволить скрипту configure получить собственное значение для CFLAGS... - person graza; 30.03.2012
comment
@graza проблема возникает, когда константа определена в нескольких файлах заголовков. Кто придет первым, тот и будет взят. Это может не контролироваться CFLAGS, поскольку заголовок может быть включен в какой-то другой заголовок и прочее! В любом случае спасибо за информацию! :) - person Ricketyship; 06.04.2012