Почему полоса не удаляет лидирующие пробелы?
Я пытался strip
ведущий пробел строки:
" Bagsværd".strip # => " Bagsværd"
Я ожидаю, что это вернется "Bagsværd"
вместо.
4 ответа
Откуда взялась строка " 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
якорь, а \p{Space}
свойство персонажа для эмуляции lstrip
, Чтобы убрать начальные и конечные пробелы, используйте:
2.0.0p353 :007 > "\u00a0Bagsværd\u00a0".gsub(/\A\p{Space}*|\p{Space}*\z/, '')
=> "Bagsværd"
Первый символ в вашей строке не является пробелом
" Bagsværd".bytes
[194, 160, 66, 97, 103, 115, 118, 195, 166, 114, 100]
" Bagsværd".chars[0].ord
=> 160
Это U+00A0
пространство без перерывов. Заметьте, я мог бы сказать это, потому что редактируемая форма вопроса сохраняет символ (в то время как любой, кто пытается вырезать и вставить из обработанного сообщения SO, не сможет воспроизвести вашу проблему)
Наиболее вероятный способ, которым strip
не удаляет пробел, это когда он на самом деле не пробел, а неразрывный пробел.
Попробуйте это на своей машине:
# encoding: utf-8
" Bagsværd".chars.map(&:ord)
На моем, используя Ruby 2.0.0p353:
# => [160, 66, 97, 103, 115, 118, 230, 114, 100]
Первый символ - это пробел или что-то еще, например, \u00af ( неразрывный пробел)
Это может дать тот же результат:
#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]