2012-02-11 3 views
17

В Ruby иногда мне нужно удалить новый символ строки в начале строки. В настоящее время я сделал следующее. Я хочу знать, как это сделать. Благодарю.В Ruby, какой самый простой способ «chomp» в начале строки вместо конца?

s = "\naaaa\nbbbb" 
s.sub!(/^\n?/, "") 
+1

Вы хотите оставить символ перевода строки на месте (в конце строки)? –

ответ

21

lstrip, кажется, что вы хотите (при условии, завершающие пробелы должны быть сохранены):

>> s = "\naaaa\nbbbb" #=> "\naaaa\nbbbb" 
>> s.lstrip #=> "aaaa\nbbbb" 

Из документов:

Возвращает копию ул с лидирующими пробелами удалены. См. Также Строка # rstrip и String # strip.

http://ruby-doc.org/core-1.9.3/String.html#method-i-lstrip

+0

стыдно за меня :) ! – fl00r

1

Это должно работать на вас: s.strip.

11

strip удалит все завершающие пропуски

s = "\naaaa\nbbbb" 
s.strip! 

Маленький хэк грызть ведущие пробелы:

str = "\nmy string" 
chomped_str = str.reverse.chomp.reverse 
+1

Просто поясните, 'String # strip' и' String # strip! 'Удалите оба * ведущих * и * завершающие * whitespace. Вот почему он работает в этом случае. – tadman

+0

yeap 'strip удалит все завершающие пробелы :) :) Но я не знаю, нужно ли ему удалять ТОЛЬКО ведущие пробелы или все из них. Во всяком случае, нет 'chomp' для ведущих пробелов – fl00r

+5

@ fl00r. Но есть' lstrip', чтобы удалить только пробелы :-) Я отправил ответ. –

2

Не уверен, что это лучший способ, но вы можете попробовать:

s.reverse.chomp.reverse 

если вы хотите оставить конечную новую строку (если она существует).

+0

Примечание: если вы передадите аргумент 'chomp', вы тоже захотите его отменить:' s.reverse.chomp (x.reverse) .reverse' – 0xtobit

6
s.sub(/^[\n\r]*/, '') 

Это удаляет ведущие новой строки (возврат каретки и перевод строки, как в chomp), а не какой-либо пробелы.

+0

'\ A' для« начала строки », возможно, было бы более правильным, чем'^'для« начала строки ». Но вышеуказанное выражение должно работать по запросу, так как 'sub' вместе со звездочкой гарантирует, что оно соответствует самой первой строке. –

7

Итак, просто для уточнения, есть три способа, которыми вы можете это поступить: sub, reverse.chomp.reverse и lstrip.

Я бы рекомендовал против sub, потому что это немного менее читаемо, но также из-за того, как это работает: создав новую строку, которая наследуется от вашей старой строки. Кроме того, вам нужно регулярное выражение для чего-то довольно простого.

Итак, вы до reverse.chomp.reverse и lstrip. Скорее всего, вы хотите lstrip, потому что это немного быстрее, но имейте в виду, что операции strip: не такие же, как у chomp операций. strip удалит всех ведущей новой строки и пробельных:

"\n aaa\nbbb".reverse.chomp.reverse # => " aaa\nbbb" 
"\n aaa\nbbb".lstrip     # => "aaa\nbbb" 

Если вы хотите, чтобы убедиться, что вы только удалить один символ, и это, безусловно, символ новой строки, использовать reverse.chomp.reverse решения. Если вы считаете, что все ведущие символы новой строки и белый пробел, пойдите с lstrip.

Один случай, который я могу придумать для использования регулярных выражений, был бы, если у вас есть неизвестное число \r s и \n s в начале и хотите обрезать их все, но не касаться каких-либо пробелов. Вы могли бы использовать цикл и больше методов String для обрезки, но это было бы просто уродливее. Последствия производительности на самом деле не так важны.

+0

Я бы сказал, что если он хочет удалить только один символ, это новая строка, его текущее решение с 'sub!' (Версия на месте) намного лучше, чем 'reverse.chomp.reverse'. –

0

способ сделать это для пробелов или не-пробельных символов, как это:

s = "\naaaa\nbbbb" 
s.slice!("\n") # returns "\n" but s also has the first newline removed. 
puts s # shows s has the first newline removed 
Смежные вопросы