【问题标题】:Why does strip not remove the leading whitespace?为什么 strip 不删除前导空格?
【发布时间】:2013-11-30 21:40:00
【问题描述】:

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

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

我希望它返回 "Bagsværd"

【问题讨论】:

  • 这很奇怪。我正在运行 Ruby 2.0.0p247 和 Rails 4.0.0,“Bagsværd”.strip 为我返回“Bagsværd”。在带有 Rails 3.2.13 的 Ruby 1.9.3p484 中也会发生同样的情况。你在其他版本的 Ruby 或 Rails 中试过吗?
  • strip 删除了我见过的每个解释器上的前导空格,将其粘贴到新的 IRB 控制台时是否得到相同的结果?
  • 没有。由于 p272(我之前使用过)的安全问题,我也刚刚升级到 2.0.0p353。是的,我已经多次重新加载控制台,但仍然得到上述输出。
  • 您的区域设置可能有问题?
  • 反对者状态原因?

标签: ruby strip ruby-2.0


【解决方案1】:

" 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 用于使用\p{Space}。另一种方法是使用 Posix [[:space:]] 字符集:" Bagsværd"[/[[:space:]]/] # => "\u00A0"
  • 这里的要点是 A> 字符串手术与 UTF-8(或 -16 等)很烂,每个 mortoray.com/2013/11/27/the-string-type-is-broken 和 B> 如果你的字符串手术失败,请吐出 " Bagsværd".bytes 到看看前导空格是否真的是32
  • 这是否是 strip() 实现中的错误?文档说“返回删除前导和尾随空格的 str 副本”。不间断空格是空格,不是吗?
  • 嗯,这似乎是一个错误——bugs.ruby-lang.org/issues/7845
  • @shau-kote 本身并不是一个错误,因为它是预期的行为,主要是(我认为)避免使用字符串方法影响现有代码。但从该线程中的 cmets 来看,这可能会在未来的版本中发生变化。
【解决方案2】:

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

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

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

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

【讨论】:

  • 因此“new-f***s can't tri-force” C-;
【解决方案3】:

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

在你的机器上试试这个:

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

在我的,使用 Ruby 2.0.0p353:

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

【讨论】:

  • 实际上,如果你编辑 OP,你会得到他的原始字符串和不间断的空格。虽然从渲染的帖子中剪切和粘贴,但 SO 已将其转换为常规空间。
  • 是的,我就是这么做的,当然,就在那儿。
【解决方案4】:

第一个字符是空格还是其他字符,例如\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]

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多