Ruby 神奇的空格

frankel · 2012年04月11日 · 最后由 zw963 回复于 2012年04月13日 · 7278 次阅读

正在做一个正则匹配,想用\s来找出文字中的某些空格,可是明明正则没写错,就是没有匹配,发现原来某个看上去是空格的字符,实际没有被 ruby 认做空格。感觉好奇怪。

本来想提交测试例子的,可是在 ruby-china 提交后,渲染出来的都是普通空格了。

请教下这是什么原因,谢谢

如果不能用文字展现,就用贴个图片吧

有可能是 unicode 中的空格(参看这个表),它们不会被 \s 匹配。

前几天我也遇到了,用 nokogiri 处理过的 html, 会被 unicode nbsp 替换 http://en.wikipedia.org/wiki/Non-breaking_space

的确是 nokogiri 引起的,用如下方法解决:

nbsp = Nokogiri::HTML(" ").text
text.gsub(/#{nbsp}/, '')

后来发现一个 ruby1.9 里针对所有空格的正则:[[:blank:]]

甚至包括全角的空格(unicode 12288),比自己写各种类型的空格更有效

#5 楼 @frankel

正因为如此,正则推荐尽量使用字符集合的实现方式。

[:alnum:] 英文大小写字符及数字,即 0-9, A-Z, a-z [:alpha:] 任何英文大小写字符,即 A-Z, a-z [:ascii:] 七位 ASCII, 包括非打印字符. [:blank:] 穸格键与 Tab 键 [:cntrl:] 控制字符,包括 CR, LF, Tab, Del.. 等等 [:digit:] 数字,即 0-9 [:graph:] 可见图形字符 (可打印字符),即除了空格键和 TAB 键以外的其他所有字符 [:upper:] 代表大写字符,即 A-Z [:lower:] 小写字符,即 a-z [:print:] 任何可打印字符,包含空格和 tab. [:punct:] 除了:space:及:alnum:以外的所有可打印字符。一般为标点符号 (punctuation symbol),即:" ' ? ! ; : # $等 [:space:] 任何会产生空白的任何字符,包括空格键,Tab, CR(回车) 等等 [:xdigit:] 代表 16 进制数字类型,即:0-9, A-F, a-f [:word:] 匹配单词的字符,等价于\w (单词的定义跟字符集有关)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号