2010-12-31 3 views
8

Я использую код ниже: ш в Рубине Регулярное выражение соответствует китайские иероглифы

puts "matched" if "中国" =~ /\w+/ 

это ставит "matched" и меня удивило, так как «中国» есть два китайских иероглифов, это не какой-либо из 0-9 , az, AZ и _, но почему он выводит «соответствие».

Может ли кто-нибудь дать мне несколько подсказок?

+0

Возможный дубликат [Как использовать регулярное выражение для utf8 в ruby] (http://stackoverflow.com/questions/256822/how-to-use-regex-for-utf8-in-ruby) – marcog

+0

они не являются тот же диалог, ссылка, на которую вы указали, обсуждает, как проверять китайские символы, моя проблема в том, почему \ w соответствует китайским иероглифам UTF-8. – ywenbo

ответ

10

Я не уверен в точном значении регулярного выражения, которое использует Ruby, но это не просто аберрация Ruby, поскольку .NET работает так же. MSDN says this об этом:

\ ш
Спички любое слово символ. Для версий не-Unicode и ECMAScript это то же самое, что и [a-zA-Z_0-9]. В категориях Unicode это то же самое, что и [\ p {Ll} \ p {Lu} \ p {Lt} \ p {Lo} \ p {Nd} \ p {Pc}].

Так что это не тот случай, \w обязательно означает просто [a-zA-Z_0-9] - это (и другие операторы) работают по-разному на строках Unicode по сравнению с тем, как они делают для них ASCii.

Это все еще отличает его от ., поскольку \w не соответствует символам пунктуации (вид - см. Ниже список \ p {Lo}), пробелы, новые строки и различные другие символы, отличные от слова.

Что касается того, что именно \p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc} делает матч, вы можете увидеть на список ссылок Unicode:

+0

спасибо. верный. – ywenbo

+0

'\ p {Word}' тоже будет работать, а также POSIX '[: word:]' –

3

Oniguruma, который является механизм регулярных выражений в Ruby, 1.9+, defines \w как:

[\w]  word character 

      Not Unicode: 
      * alphanumeric, "_" and multibyte char. 
      Unicode: 
      * General_Category -- (Letter|Mark|Number|Connector_Punctuation) 

В 1.9+, Рубин знает, если строка имеет символы Unicode, и автоматически переключается на использование режима Unicode для сопоставления шаблонов.

Смежные вопросы