我使用下面的代码:
puts "matched" if "中国" =~ /\w+/
它让"matched"
感到惊讶,因为“中国”是两个汉字,它不是0-9,az,AZ和_中的任何一个,而是输出“匹配”的原因。
有人可以给我一些线索吗?
答案 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模式进行模式匹配。