如何在Ruby 1.9中匹配Unicode单词?

10
我正在使用Ruby 1.9,想知道我需要使用哪个正则表达式才能使下面的语句为真:
Encoding.default_internal = Encoding.default_external = 'utf-8'
"föö".match(/(\w+)/u)[1] == "föö"
# => false

你必须将两个字符串转换为相同的Unicode格式,才能进行匹配。使用Iconv可以将字符串转换为特定的Unicode格式。 - krunal shah
添加了默认编码。仍然不起作用... - Reactormonk
请尝试在脚本开头添加注释“# coding utf-8”,并确保脚本文件是utf-8格式。 - Nakilon
使用[/(\w+)/u,1] - 这更短。甚至只需使用[/\w+/u],因为您的正则表达式中的()会获取所有内容。 - Nakilon
3个回答

37
# encoding=utf-8 
p "föö".match(/\p{Word}+/)[0] == "föö"

1
真是疯狂,你需要将源代码标记为UTF8才能使正则表达式以正确的编码方式运行。非常感谢! - demental
2
一个很好的文件可以在这里找到:http://www.ruby-doc.org/core-1.9.3/Regexp.html#label-Character+Properties - Tamer Shlash

1

您可以使用内部(?u)语法手动开启Unicode匹配

"föö".match(/(?u)(\w+)/)[1] == "föö"
# => true

然而,使用Unicode属性语法(steenslag的答案)或POSIX括号语法更好,因为它们都自动尊重Unicode代码点:

"föö".match(/(\p{word}+)/)[1] == "föö"
# => true

"föö".match(/([[:word:]]+)/)[1] == "föö"
# => true

请查看此博客文章,了解有关在Ruby正则表达式中匹配Unicode字符的更多信息。


0

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