Regexp与单词中的utf8字符不匹配(\ w +)

时间:2013-11-28 15:00:07

标签: ruby-on-rails ruby regex

为什么以下代码返回nil:

'The name of the city is: Ørbæk'.match(/:\s\w+/)
#=> nil

当我希望它返回"Ørbæk"

我尝试在文档的开头设置#encoding=utf-8,但它不会改变任何内容。

PS。 Ø和Æ是丹麦字母

3 个答案:

答案 0 :(得分:7)

元字符\w等同于字符类[a-zA-Z0-9_];仅匹配字母,数字和_

而是使用字符属性\p{Word}

'The name of the city is: Ørbæk'.match(/:\s\p{Word}+/)
# => #<MatchData ": Ørbæk">

根据Character Properties from Ruby Regexp documentation

  

/\p{Word}/ - 以下Unicode常规类别之一的成员Letter,Mark,Number,Connector_Punctuation

答案 1 :(得分:2)

您可以改为使用\ p {Word}:

irb(main):001:0> 'The name of the city is: Ørbæk'.match(/:\s\p{Word}+/)
=> #<MatchData ": Ørbæk">

答案 2 :(得分:1)

如果您要匹配的单词只包含字母字符,请使用\p{L}

match(/:\s\p{L}+/)