2013-02-25 2 views
4

Я просто портировал небольшой камень из Ruby 1.9.3 в новый iPhone Ruby 2.0.0. Единственное изменение, которое я должен был сделать, было в регулярном выражении.Регулярно немного отличается в Ruby 2?

В соответствии с 1.9.3 следующее регулярное выражение будет соответствовать любой строке, содержащей символы, отличные от цифр, числовых знаков пунктуации и пробелов (включая неразрывное пространство).

/[^[[:space:]]\d\-,\.]/ 

Под 2.0.0 мне пришлось перемещать класс пространства Posix от начала класса отрицания.

/[^\d\-,\.[[:space:]]]/ 

Я не нашел это изменение, упомянутое в примечаниях к исправлению, которые я рассмотрел. Документировано ли это где угодно?

ответ

8

Механизм регулярного выражения был изменен на Onigmo (на основе Oniguruma), и это может вызвать проблемы.

Насколько я могу судить, вы неправильно объявляете правильное выражение. Второй набор скобок не требуется:

/[^[:space:]\d\-,\.]/ 

[:space:] декларация недействительна только внутри набора, так что вы увидите, что он появится в [[:space:]] если они используются в изоляции. В вашем случае у вас есть еще несколько дополнений к набору.

Я не уверен, почему \s не хватило бы в этом случае.

+0

Спасибо за отличный ответ. Я заметил изменение Onigmo, но не думал, что это сделает регулярное выражение более строгим. Я также ценю опеку над классами. Я не часто их использую и не понял, какие условия требуют двойные квадратные скобки. Благодаря! В разделе 1.9.3-p385 класс символов пробела '\ s' не соответствовал неразрывным пробелам,' 0xA0', поэтому я использовал класс '[: space:]' posix. Я проверю '\ s' под 2.0.0-p0 и отчитаюсь здесь, если он работает. –

+0

Это правда. Поскольку '\ xA0' - это только неразрывное пространство, если вы используете Latin1 как свой набор символов, а не UTF-8. – tadman

+0

Мои тесты за последние несколько минут показывают, что '\ s' под 2.0.0-p0 все еще не соответствует' 0xA0', как и в 1.9.3. Кроме того, размещение класса пространства posix сразу после '^' заставляет это regex терпеть неудачу под 2.0.0. Размещение его после '\ d' или после' \ .' делает его соответствующим, как ожидалось. Интересно, считают ли разработчики Onigmo это желаемое поведение или неожиданную морщину. –