2012-11-08 154 views
5

在ruby 1.9.3中,正則表達式引擎不會將nbsp(\ u00A0)視爲空格(\ s)。這對我來說常常是一件壞事。紅寶石正則表達式處理

所以我的問題是,這會改變2.0?如果沒有,有沒有辦法猴子修補解決方案?

回答

7

使用Unicode屬性(需要聲明一個匹配的源代碼的編碼這個工作):

# encoding=utf-8 
if subject ~= /\p{Z}/ 
    # subject contains whitespace or other separators 

或使用POSIX字符類:

if subject ~= /[[:space:]]/ 

the docs\s只會現在和將來匹配[ \t\r\n\f]

+0

謝謝Tim,\ p {Z}很有趣。你能解釋一下其他分隔符的含義嗎? – pguardiario

+0

@pguardiario:對不起,我不知何故錯過了你的評論。 Unicode標準定義了許多其他分隔符,這些分隔符似乎主要用於東方語言,其中文字不一定明顯地被空白分隔。 –

0

在Ruby中,我建議使用Unicode字符類 「空格分隔\p{Zs}的:

/\p{Zs}/u =~ "\xC2\xA0" 
/\p{Zs}/u =~ "\u00A0" 
/\p{Zs}/u =~ HTMLEntities.new.decode(' ') 

中查看Unicode character properties Ruby的文檔。

注意:確保您的輸入字符串是有效的UTF-8編碼。其他編碼中也有非中斷空格,例如ISO-8859-1(Latin1)中的「\ xA0」。 More info on the "non-breaking space"。提供:在大多數支持Unicode的RegExp風格和編程語言中,字符類\s通常包含Unicode「分隔符」屬性\p{Z}(如Tim Pietcker所述)中的所有字符;字符分類爲\s。然而,Java紅寶石是這裏流行的例外,\s只匹配[ \t\r\n\f]