2012-11-08 107 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]