Ruby正则表达式中的\ w匹配中文字符

时间:2010-12-31 13:34:10

标签: ruby regex

我使用下面的代码:

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

它让"matched"感到惊讶,因为“中国”是两个汉字,它不是0-9,az,AZ和_中的任何一个,而是输出“匹配”的原因。

有人可以给我一些线索吗?

2 个答案:

答案 0 :(得分:11)

我不确定Ruby使用的正则表达式的确切风格,但这不仅仅是Ruby异常,因为.net也是如此。关于它的MSDN says this

  

\ W
  匹配任何单词字符。对于   非Unicode和ECMAScript   实现,这是相同的   [A-ZA-Z_0-9]。在Unicode类别中,   这是一样的   [\ p {的L1} \ p {路} \ p {LT} \ p {螺} \ p {钕} \ 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参考列表中看到:

答案 1 :(得分: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+中,Ruby知道该字符串是否具有Unicode字符,并自动切换为使用Unicode模式进行模式匹配。

相关问题