2010-12-04 36 views
2

看看这个:有没有办法使用正则表达式匹配字符与波形符?

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

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

有没有办法解决呢?

编辑: 看来,红宝石缺乏对正则表达式比较Unicode字符支持,我旗(忽略大小写)... 利用磁共振成像1.8.7p249

+3

检查您对问题的假设并相应地更新它。从上面可以看出,Ruby不会将Ã和ã视为与案例相关,仅此而已。尽管这仍然是一个问题,但它是一个不同的问题。 – 2010-12-05 00:04:27

+0

Perl当然可以对Unicode应用不区分大小写。默认情况下,它不会执行NFD风格的规范对等,例如,'chr(0x17F)=〜/ s/i`,其中017F是LATIN SMALL LETTER LONG S.类似地,``N \ N {U + C3} O“=〜/ n \ N {U + E3} o/i`。要处理带有组合标记的替代表示,您需要首先将模式和字符串转换为NFD(标准分解)。 – tchrist 2010-12-05 06:17:16

回答

7

不知道Ruby,但大多数正则表达式引擎唐对于非ASCII字符不了解大写/小写。你可以做的最好的是:

/(n[ãÃ]o)/ 

理解大写/小写关系的问题是它是语言相关的。 Unicode只编码字符的形式,而不是含义。因此,unicode中的大写字符可以具有不同的小写字符,具体取决于语言。

SS为例。在英文中,小写字母将是ss,但在德语中可以是ß。另一个例子是英文字母I,其小写为i,但在土耳其语中,其小写字母为ı(没有小点)。这是因为i土耳其文有大写İ(带点)。

由于这个原因,大多数正则表达式实现只是放弃并拒绝理解标准ASCII之外的字符的大写/小写关系。