Отмечено Брайаном Кэндлером на ruby-talk:
\w
соответствует только буквам и цифрам ASCII, а [[:alpha:]]
соответствует полному набору букв Unicode.
\d
соответствует только цифрам ASCII, а [[:digit:]]
соответствует полному набору чисел Unicode.
Таким образом, поведение является «согласованным», и у нас есть простой обходной путь для номеров Unicode. Читая \w
в тот же документ Oniguruma, мы видим текст:
\w word character
Not Unicode: alphanumeric, "_" and multibyte char.
Unicode: General_Category -- (Letter|Mark|Number|Connector_Punctuation)
В свете реального поведения Ruby и приведенного выше текста «Not Unicode» может показаться, что документация описывает два режима: режим Unicode и режим Not Unicode, и что Ruby работает в режиме Not Unicode.
Это могло бы объяснить, почему \d
не соответствует полному набору Unicode: хотя документация Oniguruma не описывает точно, что сопоставляется в режиме Not Unicode, теперь мы знаем, что поведение, задокументированное как «Unicode», не ожидается.
p "abç".scan(/\w/), "abç".scan(/[[:alpha:]]/)
#=> ["a", "b"]
#=> ["a", "b", "\u00E7"]
Читателю остается в качестве упражнения выяснить, как (если вообще) включить режим Unicode в регулярных выражениях Ruby, поскольку флаг /u
(например, /\w/u
) этого не делает. (Возможно, Ruby нужно перекомпилировать со специальным флагом для Oniguruma.)
Обновление: похоже, что документ Oniguruma, на который я ссылаюсь, не соответствует Ruby 1.9. См. обсуждение этого билета, включая следующие сообщения:
[Юи НАРУСЕ] "RE.txt предназначен для оригинального Oniguruma, а не для регулярного выражения Ruby 1.9. Нам может понадобиться наш собственный документ."
[Matz] "Наш Oniguruma является разветвленным. Оригинальный Oniguruma найден в geocities.jp не изменено».
Подробнее. Вот официальная документация по синтаксису регулярных выражений Ruby 1.9:
https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc
person
Phrogz
schedule
09.08.2011