Отмечено Брайаном Кэндлером на ruby-talk :
\w
соответствует только буквам и цифрам ASCII, а [[:alpha:]]
соответствует полному набору букв Unicode.
\d
соответствует только цифрам ASCII, а [[:digit:]]
соответствует полному набору номеров 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 & mdash; и что Ruby работает в режиме Not Unicode .
Это объясняет, почему \d
не соответствует полному набору Unicode: хотя документация Oniguruma не в состоянии точно описать то, что соответствует, когда в режиме не Unicode, теперь мы знаем, что поведение, задокументированное как "Unicode", не должно быть ожидается.
p "abç".scan(/\w/), "abç".scan(/[[:alpha:]]/)
#=> ["a", "b"]
#=> ["a", "b", "\u00E7"]
Читателю оставлено в качестве упражнения узнать, как (если это вообще возможно) включить режим Unicode в регулярных выражениях Ruby, поскольку флаг /u
(например, /\w/u
) этого не делает. (Возможно, Ruby нужно перекомпилировать со специальным флагом для Онигурума.)
Обновление : может показаться, что документ Онигурума, на который я ссылаюсь , не подходит для Ruby 1.9 . См. обсуждение этого билета , включая следующие сообщения:
[Yui NARUSE] "RE.txt для оригинального Oniguruma, а не для регулярного выражения Ruby 1.9. Нам может понадобиться наш собственный документ."
[Matz] «Наш Онигурума разветвлен. Оригинальный Онигурума, найденный в geocities.jp, не был изменен».
Лучшая справка : Вот официальная документация по синтаксису регулярного выражения Ruby 1.9:
https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc