看看这个:
"nAo".match(/(nao)/i) # => #<MatchData "nAo" 1:"nAo">
"nÃo".match(/(não)/i) # => nil
有没有办法解决这个问题?
编辑: 似乎ruby在i标志的regexp比较中缺乏对unicode字符的支持(忽略大小写)... 使用MRI 1.8.7p249
答案 0 :(得分:7)
不了解Ruby,但大多数正则表达式引擎不理解非ASCII字符的大写/小写。你能做的最好的是:
/(n[ãÃ]o)/
理解大写/小写关系的问题在于它与语言有关。 Unicode只编码字符的形式,而不是意义。因此,unicode中的大写字符可以根据语言使用不同的小写字符。
以SS
为例。在英语中,小写字母为ss
,但在德语中,它可以是ß
。另一个例子是字母I
,其中英文的小写字母为i
但土耳其语的小写字母为ı
(没有点)。这是因为土耳其语中的i
大写İ
(带点)。
因此,大多数正则表达式实现只是放弃并拒绝理解标准ASCII之外的字符的大写/小写关系。
答案 1 :(得分:0)
尝试为Ruby找到一些unicode normalization模块。
答案 2 :(得分:0)
请注意,Ruby自1.9以来具有更好的字符支持(似乎您运行Ruby 1.8.7)。在Ruby 1.9中,旧的正则表达式引擎被Oniguruma取代。