Разница в поведении Unicode между `\ w` vs` [[: alpha:]] `в Ruby - PullRequest
0 голосов
/ 15 мая 2018

(В этом вопросе игнорируйте число и подчеркивание совпадения \w, что не имеет отношения к обсуждению здесь.)
Согласно Документам Онигурума , оба класса сокращенных символов, такие как *Классы 1005 * и POSIX, такие как [:alpha:], имеют аналогичное поведение в отношении Unicode: они имеют простое поведение ascii для "Not Unicode Case" (я предполагаю, что это означает, что encoding строки не является Unicode), и другое поведение, котороеиспользует свойства Unicode для «Unicode Case».

Из этой документации это звучит так, как если бы одно из них использовало свойства Unicode, а другое также использовало бы их.Однако на практике они кажутся разными: классы POSIX автоматически используют свойства Unicode, тогда как классы типа \w должны быть явно помечены ?u, чтобы использовать сопоставление на основе свойств Unicode:

$ ruby -e 'print("~café.".encoding)'
UTF-8
$ ruby -e 'print(/[[:alpha:]]+/.match("~café."))'
café
$ ruby -e 'print(/\w+/.match("~café."))'
caf
$ ruby -e 'print(/(?u)\w+/.match("~café."))'
café
$ ruby -v
ruby 2.3.6p384 

Isэто ошибка, или моя интерпретация документации неверна?(И что именно делает ?u, может кто-то ссылаться на то, где это задокументировано?)

1 Ответ

0 голосов
/ 15 мая 2018

Начиная с версии 2.0, Ruby использует Onigmo , форк Oniguruma, который поддерживает больше функций, реализованных в Perl 5.10.

Если вы сравните документ, который вы связали (Oniguruma) с Onigmo'sdoc вы можете увидеть разницу между \w описаниями:

  • Онигурума:

\ w символ слова

       Not Unicode:
         alphanumeric, "_" and multibyte char.

       Unicode: General_Category -- (Letter|Mark|Number|Connector_Punctuation)
  • Onigmo:

\ w символ слова

       Not Unicode:
         alphanumeric and "_".

       Unicode: General_Category -- (Letter|Mark|Number|Connector_Punctuation)

       It depends on ONIG_OPTION_ASCII_RANGE option that non-ASCII char includes or not.

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

Модификатор u переключает классы сокращенных символов с «Не Unicode» (по умолчанию) на «Unicode».Вот почему вы получаете только caf без него и café с ним при попытке сопоставить его с использованием класса символов \w.

С другой стороны, класс символов [[:alpha:]], кажется, ужепо умолчанию расширен до символов Юникода, так как он соответствует "café" без модификатора u.Начало объяснения можно найти в документе:

В зависимости от опции ONIG_OPTION_ASCII_RANGE и опции ONIG_OPTION_POSIX_BRACKET_ALL_RANGE, скобки POSIX соответствуют не-ASCII-символам или нет.

Но выможет заставить его работать с помощью модификатора (?a).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...