有没有办法使用正则表达式匹配代字号的字符?

时间:2010-12-04 23:52:12

标签: ruby regex unicode case-insensitive

看看这个:

"nAo".match(/(nao)/i) # => #<MatchData "nAo" 1:"nAo">

"nÃo".match(/(não)/i) # => nil

有没有办法解决这个问题?

编辑: 似乎ruby在i标志的regexp比较中缺乏对unicode字符的支持(忽略大小写)... 使用MRI 1.8.7p249

3 个答案:

答案 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取代。

http://www.geocities.jp/kosako3/oniguruma/