Подтвердить что ты не робот

Почему полоса не удаляет ведущие пробелы?

Я попытался strip лидировать пробел строки:

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

Я ожидаю, что он вернет "Bagsværd" вместо этого.

4b9b3361

Ответ 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} символьное свойство для эмуляции lstrip. Чтобы удалить как верхние, так и конечные пробелы, используйте:

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

Ответ 2

Первый символ в вашей строке не является пробелом

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

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

Это U+00A0 свободное пространство. Заметьте, я мог бы сказать это, потому что редактируемая форма вопроса сохраняет характер (в то время как любой, кто пытается вырезать и вставлять из обработанной SO-почты, не сможет реплицировать вашу проблему)

Ответ 3

Самый вероятный способ, которым strip не удаляет пробел, - это когда он не является пространством, но является неразрывным.

Попробуйте это на вашей машине:

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

На моем, используя Ruby 2.0.0p353:

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

Ответ 4

Является ли первый символ пробелом или чем-то еще, например. \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]