在Ruby正则表达式中,\w能够匹配中文字符吗?

9
我使用以下代码:

我使用以下代码:

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

在it技术中,它会将"matched"与给定内容进行匹配,让我感到惊讶的是,"中国"是两个汉字,不包含0-9、a-z、A-Z和_,但为什么它会输出"matched"。

请问有人能提供一些线索吗?


可能是重复的问题:如何在Ruby中使用UTF8正则表达式 - moinudin
它们不是相同的对话框,你指向的链接讨论如何验证中文字符,我的问题是为什么\w匹配UTF-8中文字符。 - ywenbo
不同的引擎有不同的解释吧,.net等引擎视中文为\w,所有的浏览器所使用的引擎都将中文视为\W,个人赞同前者。 - dexiang
2个回答

11
我不确定 Ruby 使用的正则表达式具体是什么样子,但这并不仅限于 Ruby,因为 .net 也是这样工作的。MSDN 对此有 解释

\w
匹配任何单词字符。对于非 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 参考列表上查看:

  • \p{Nd} 十进制数字
  • \p{Pc} 标点符号连接器

  • 1
    实际上,\w 对于中文或带重音符号的字符对我来说不起作用,但是 \p{Word} 可以。 - Asped

    3

    Oniguruma是Ruby 1.9+中的正则表达式引擎,\w定义为:

    [\w]       word character
    
               Not Unicode:
               * alphanumeric, "_" and multibyte char. 
               Unicode:
               * General_Category -- (Letter|Mark|Number|Connector_Punctuation)
    

    从1.9版本开始,Ruby会自动检测字符串是否包含Unicode字符,并自动切换到Unicode模式进行模式匹配。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接