为什么strip不会删除前导空格?

时间:2013-11-30 21:40:00

标签: ruby strip ruby-2.0

我尝试strip字符串的前导空格:

" Bagsværd".strip # => " Bagsværd"

我希望它会返回"Bagsværd"

4 个答案:

答案 0 :(得分:34)

字符串" Bagsværd"来自哪里?

字符串开头的空格字符可能不是“普通”空格,而是非空格(U + 00A0):

2.0.0p353 :001 > " Bagsværd".strip
 => "Bagsværd" 
2.0.0p353 :002 > "\u00a0Bagsværd".strip
 => " Bagsværd" 

您可以使用gsub而非strip

删除它
2.0.0p353 :003 > "\u00a0Bagsværd".gsub(/\A\p{Space}*/, '')
 => "Bagsværd" 

这使用\A anchor\p{Space} character property来模拟lstrip。要删除前导和尾随空格,请使用:

2.0.0p353 :007 > "\u00a0Bagsværd\u00a0".gsub(/\A\p{Space}*|\p{Space}*\z/, '')
 => "Bagsværd" 

答案 1 :(得分:4)

字符串中的第一个字符是不是空格

" Bagsværd".bytes
[194, 160, 66, 97, 103, 115, 118, 195, 166, 114, 100]

" Bagsværd".chars[0].ord
 => 160

这是U+00A0不间断的空间。注意我可以告诉你,因为问题的可编辑形式保留了角色(而任何试图从渲染 SO帖子剪切和粘贴的人都无法复制你的问题)

答案 2 :(得分:2)

strip最不可能删除空格的方式是,它不是真正的空间,而是一个不间断的空间。

在你的机器上试试这个:

# encoding: utf-8
" Bagsværd".chars.map(&:ord)

我的,使用Ruby 2.0.0p353:

# => [160, 66, 97, 103, 115, 118, 230, 114, 100]

答案 3 :(得分:0)

第一个字符是空格还是其他字符,例如\ u00af(Non-breaking space

这可能会产生相同的结果:

#encoding: utf-8
puts " Bagsværd".strip #Bagsværd
a = "\u00A0Bagsværd"
puts a         # Bagsværd
puts a.strip  # Bagsværd

#Maybe the example works not, when the code is posted/taken via cut+paste
b = ' Bagsværd'
p a == b  #true

您可以查看您拥有的内容:

a = "\u00A0Bagsværd"
b = ' Bagsværd'
p a.codepoints.to_a #[160, 66, 97, 103, 115, 118, 230, 114, 100]
p b.codepoints.to_a #[32, 66, 97, 103, 115, 118, 230, 114, 100]