【发布时间】:2013-11-28 15:00:07
【问题描述】:
为什么下面的代码返回nil:
'The name of the city is: Ørbæk'.match(/:\s\w+/)
#=> nil
当我期望它返回 "Ørbæk"
我尝试在文档开头设置#encoding=utf-8,但它没有任何改变。
PS。 Ø 和 Æ 是丹麦字母
【问题讨论】:
标签: ruby-on-rails ruby regex
为什么下面的代码返回nil:
'The name of the city is: Ørbæk'.match(/:\s\w+/)
#=> nil
当我期望它返回 "Ørbæk"
我尝试在文档开头设置#encoding=utf-8,但它没有任何改变。
PS。 Ø 和 Æ 是丹麦字母
【问题讨论】:
标签: ruby-on-rails ruby regex
元字符\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
【讨论】:
您可以使用 \p{Word} 代替:
irb(main):001:0> 'The name of the city is: Ørbæk'.match(/:\s\p{Word}+/)
=> #<MatchData ": Ørbæk">
【讨论】:
如果您要匹配的单词仅包含字母字符,则使用\p{L}:
match(/:\s\p{L}+/)
【讨论】: