2010-12-04 37 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之外的字符的大寫/小寫關係。