Функция Ruby для удаления всех пробелов?


573

Что такое функция Ruby для удаления всех пробелов? Я ищу что-то вроде PHP trim()?


36
Ваш вопрос не ясен: вы хотите удалить все пробелы или вы хотите избавиться от ведущих и конечных пробелов?
Синан Юнюр

25
PHP trim()удаляет пробелы « от начала и конца строки » (как указано в документации ), он не удаляет «все пробелы».
Tadeck

3
Если вы сомневаетесь, посмотрите онлайн-документацию по Ruby для класса String (см. Стр. Ниже).
Меровекс

2
Обратите внимание, что все ответы, использующие String#stripили соответствующие /\s+/, удаляют только пробелы ASCII. Если вы хотите убедиться, что все не-ASCII пробелы тоже перехвачены (например, HTML &nbsp), посмотрите странно непопулярный ответ от @EBooker.
MatzFan

1
Жаль, что такие великие ответы не могут получить окончательного достоинства того, кто был принят
Новая Александрия

Ответы:


846

Если вы хотите удалить только начальные и конечные пробелы (например, обрезку PHP), вы можете использовать их .strip, но если вы хотите удалить все пробелы, вы можете использовать .gsub(/\s+/, "")вместо них.


5
Означает ли "/ \ s + /" простой пробел?
Начинающий рельс

54
\ s + означает 1 или более пробельных символов (пробел, новая строка, табуляция). // окружающие показывают, что это регулярное выражение.
dylanfm

3
Это не эквивалентно trim ()
Бретт Холт

6
полоса была именно то, что я искал, спасибо за хороший вопрос и awnser!
Франсуа

15
@BrettHolt Выражение gsub не то же самое, что и trim, но спрашивающий включил фразу «all whitespace», которая также не совпадает с trim. Поэтому я дал альтернативы.
joel.neely

495
s = "I have white space".delete(' ')

И подражать trim()функции PHP :

s = "   I have leading and trailing white space   ".strip

12
это гораздо более читабельно, чем регулярное выражение, почему это не так популярно?
Карбасс

89
@ckarbass: потому что многие люди предпочитают слишком сложные решения простых проблем. Уходит с опытом.
Эд С.

97
@ckarbass @Ed S. Это не так популярно, потому что это не то же самое. В первоначальном вопросе использовалась фраза «все пробелы», которая включает в себя вкладки, новые строки и т. Д. Этот предложенный ответ не удалит эти другие пробельные символы. Что касается «чрезмерно сложного», я предлагаю сравнить простое регулярное выражение с .delete(' ').delete('\t').delete('\n') ..., которое является слишком многословным и предоставляет много возможностей для опечаток и ошибок пропуска.
joel.neely

13
@ joel.neely: я ответил на этот вопрос давным-давно, но прочитал вопрос еще раз, на этот раз более внимательно. ОП запросил «функцию для удаления всех пробелов» , но затем попросил «что-то вроде PHP trim ()» . Так что немного сложно точно знать, чего они хотят здесь. trim()конечно, не удаляет символы новой строки и другие пробельные символы. Вы выбираете одну интерпретацию расплывчатого вопроса.
Эд С.

4
@ joel.neely: Тем не менее, я согласен, что решение, которое выходит за рамки буквального толкования вопроса, является лучшим в этом случае (т. е. регулярное выражение, удаляющее все символы, которые составляют пробел, а не строку delete()вызовов).
Эд С.

163

Связанный ответ:

"   clean up my edges    ".strip

возвращается

"clean up my edges"

Это тот, о котором я забыл. Я знал, что есть метод для удаления пробелов, который будет делать это по умолчанию, если не было передано никаких аргументов. +1
Эд С.

Это эквивалентно отделке. Пожалуйста, обратитесь к цитате из @Tadeck выше.
Бретт Холт

3
Если существует вероятность, что переменная имеет значение nil, обязательно запустите .to_sметод перед запуском strip, чтобы метод strip не вызывал ошибку. Ex. str=nil; str.to_s.strip #=> ""
scarver2

Я предпочитаю some_data.strip! если some_data.is_a? Строка
slindsey3000

156

String#strip - удалить все пустые места от начала и до конца.

String#lstrip - просто с самого начала.

String#rstrip - только с конца.

String#chomp(без аргументов) - удаляет разделители строк ( \nили \r\n) с конца.

String#chop - удаляет последний символ.

String#delete- x.delete(" \t\r\n")- удаляет все перечисленные пробелы.

String#gsub- x.gsub(/[[:space:]]/, '')- удаляет все пробелы, в том числе Юникода из них .


Примечание . Все приведенные выше методы возвращают новую строку, а не изменяют оригинал. Если вы хотите изменить строку на месте, вызовите соответствующий метод с !в конце.


Пример удаления String # использует регулярное выражение, но \sв кавычках вместо косых черт. Также я не смог найти упоминаний в документации, что delete может принимать регулярное выражение в качестве аргумента.
ленивец

@slothbear, это не регулярное выражение, это небольшой набор шаблонов, которые напоминают регулярные выражения. Что касается документации, #deleteкак говорят, работает аналогично #count. Вы также можете попробовать это в консоли.
ndnenkov

Спасибо, что научил меня чему-то новому. А также спасибо за напоминание, чтобы попробовать вещи в наименьшем возможном контексте (командная строка).
ленивец

1
@SeinopSys Я хотел оставить этот ответ только Ruby.
ndnenkov

2
Только последний пример в этом ответе ловит ужас ASCII 160 «неразрывное пространство», проклятие веб-скребков. #stripне. См stackoverflow.com/questions/4859438/...
MatzFan

95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

Удалить работает быстрее =)

user         system     total      real
gsub, s      0.180000   0.010000   0.190000 (0.193014)
gsub, s+     0.200000   0.000000   0.200000 (0.196408)
gsub, space  0.220000   0.000000   0.220000 (0.222711)
gsub, join   0.200000   0.000000   0.200000 (0.193478)
delete       0.040000   0.000000   0.040000 (0.045157)

1
но это удаляет только spaces, не всеwhite spaces
Гавриил

1
delete(" \t\r\n")позаботится о типичных пробелах, и все еще быстрее, чем gsub.
Сет Джеффри

94

Если вы используете Rails / ActiveSupport , вы можете использовать squishметод. Он удаляет пробелы на обоих концах строки и группирует несколько пробелов в один пробел.

Например,

" a  b  c ".squish

приведет к:

"a b c"

Проверьте эту ссылку от api.rubyonrails.org .


4
Обратите внимание, что ответы только на ссылки не приветствуются, поэтому ответы SO должны быть конечной точкой поиска решения (в отличие от еще одной остановки ссылок, которая, как правило, со временем устареет). Пожалуйста, рассмотрите возможность добавления отдельного краткого обзора здесь, сохраняя ссылку в качестве ссылки.
Клеопатра

2
Я думаю, что этот ответ был достаточно объяснен, и тот факт, что ссылка была справочной, поскольку сам ответ был четко объяснен. Эта функция была хороша, спасибо
ksugiarto

4
Это из ActiveSupport. Вам не нужны все Rails, чтобы использовать его, но вам нужен по крайней мере ActiveSupport иrequire 'active_support/core_ext/string/filters'
Джастин Форс

2
Чтобы было ясно, это любой пробел. Например"a \t \n \f \r \v b".squish == "a b"
Purplejacket

47

Уже немного поздно, но любой другой, кто ищет эту страницу в Google, может заинтересоваться этой версией -

Если вы хотите очистить часть предварительно отформатированного текста, который пользователь мог каким-то образом вырезать и вставить в ваше приложение, но сохранить интервал между словами, попробуйте следующее:

content = "      a big nasty          chunk of     something

that's been pasted                        from a webpage       or something        and looks 

like      this

"

content.gsub(/\s+/, " ").strip

#=> "a big nasty chunk of something that's been pasted from a webpage or something and looks like this"

33
Можно также использовать squishметод Rails : apidock.com/rails/String/squish
Филипп Кебб

5
Или, если у вас нет Rails, и у вас нет перевода строки, это squeeze(" ")может сработать.
Эндрю Гримм

45

.stripМетод Руби выполняет PHP-эквивалент trim().

Чтобы удалить все пробелы:

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"

@Tass дал мне понять, что мой первоначальный ответ удаляет повторяющиеся буквы подряд - YUCK! С тех пор я переключился на метод squish, который более умен в таких случаях, если использовать Rails Framework.

require 'active_support/all'
"  leading    trailing   ".squish
=> "leading trailing"

"  good    men   ".squish
=> "good men"

Цитировать: http://apidock.com/rails/String/squish


1
Это удалит «присоединенные» дубликаты символов. "good men".squeeze.stripвернется"god men"
ТАСС

1
Спасибо, что указали на @Tass. Я отредактировал свой ответ в пользу метода сжатия.
scarver2

1
+1 за «повторяющиеся буквы подряд». Я не мог придумать способ описать сценарий. Отлично сработано! :-)
Tass

26
" Raheem Shaik ".strip

Это удалит левый и правый боковые пространства. Этот код даст нам:"Raheem Shaik"


20

Также не забывайте:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]

6
Так что s.split.join сделает эту работу.
Петр Брудный

1
Это хорошо при повторении:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar

20

split.join взорвет все пробелы в любом месте строки.

"  a b  c    d     ".split.join
> "abcd"

Его легко набирать и запоминать, поэтому он удобен для консоли и для быстрого взлома. Возможно не приветствуется в серьезном коде, хотя, поскольку он маскирует намерение.

(На основании комментария Петра в ответе Юстикла выше.)


1
Большое, большое спасибо за этот комментарий :-) Это единственный метод, который работает, если у вас есть длинная строка, которая выглядит как абзац.
Boomerange

12

Вы могли бы попробовать это

"Some Special Text Values".gsub(/[[:space:]]+/, "")

using : space: удаляет неразрывный пробел вместе с обычным пробелом.


1
На самом деле это лучший ответ IMHO, так как в диком HTML &nbspи любых других пробелах, не относящихся к ASCII, они не будут удалены String#stripили сопоставлены /\s/. См. Раздел «Выражения в скобках POSIX» в документах
Regexp

8

Используйте gsub или удалите. Разница в том, что gsub может удалить вкладки, а удалить - нет. Иногда у вас есть вкладки в файлах, которые добавляются редакторами.

a = "\tI have some whitespaces.\t"
a.gsub!(/\s/, '')  #=>  "Ihavesomewhitespaces."
a.gsub!(/ /, '')   #=>  "\tIhavesomewhitespaces.\t"
a.delete!(" ")     #=>  "\tIhavesomewhitespaces.\t"
a.delete!("/\s/")  #=>  "\tIhavesomewhitespaces.\t"
a.delete!('/\s/')  #=>  using single quote is unexpected, and you'll get "\tI have ome whitepace.\t"

8

Есть много способов:
удалить пробелы с обеих сторон:

Вроде как обрезка php ()

Foo_bar.strip

Чтобы удалить все пробелы:

Foo_bar.gsub(/ /, "")

Чтобы удалить все пробелы:

Foo_bar.gsub(/\s/, "")


6

Метод gsub подойдет просто отлично.
Метод gsub может быть вызван на строку и говорит:

a = "this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring

Метод gsub ищет каждое вхождение первого аргумента и заменяет его вторым аргументом. В этом случае он заменит все пробелы в строке и удалит ее.

Другой пример:

b = "the white fox has a torn tail"

Заменим каждое вхождение буквы «т» на заглавную «Т»

b = b.gsub("t","T")
puts b 
#Output: The whiTe fox has a Torn Tail

5

Для поведения, точно совпадающего с PHP trim, самый простой метод - использовать String#stripметод, например так:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
new_string = string.strip
puts "Updated  [#{new_string}]:#{new_string.length}"

Ruby также имеет версию для редактирования на месте, которая также называется String.strip!(обратите внимание на завершающий символ '!'). Это не требует создания копии строки и может быть значительно быстрее для некоторых целей:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated  [#{string}]:#{string.length}"

Обе версии производят этот вывод:

Original [  Many have tried; many have failed!    ]:40
Updated  [Many have tried; many have failed!]:34

Я создал бенчмарк для тестирования производительности некоторых основных применений stripи strip!, а также некоторых альтернатив. Тест такой:

require 'benchmark'

string = 'asdfghjkl'
Times = 25_000

a = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
b = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
c = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
d = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }

puts RUBY_DESCRIPTION
puts "============================================================"
puts "Running tests for trimming strings"

Benchmark.bm(20) do |x|
  x.report("s.strip:")                 { a.each {|s| s = s.strip } }
  x.report("s.rstrip.lstrip:")         { a.each {|s| s = s.rstrip.lstrip } }
  x.report("s.gsub:")                  { a.each {|s| s = s.gsub(/^\s+|\s+$/, "") } }
  x.report("s.sub.sub:")               { a.each {|s| s = s.sub(/^\s+/, "").sub(/\s+$/, "") } }

  x.report("s.strip!")                 { a.each {|s| s.strip! } }
  x.report("s.rstrip!.lstrip!:")       { b.each {|s| s.rstrip! ; s.lstrip! } }
  x.report("s.gsub!:")                 { c.each {|s| s.gsub!(/^\s+|\s+$/, "") } }
  x.report("s.sub!.sub!:")             { d.each {|s| s.sub!(/^\s+/, "") ; s.sub!(/\s+$/, "") } }
end

Вот результаты:

ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin14]
============================================================
Running tests for trimming strings
                           user     system      total        real
s.strip:               2.690000   0.320000   3.010000 (  4.048079)
s.rstrip.lstrip:       2.790000   0.060000   2.850000 (  3.110281)
s.gsub:               13.060000   5.800000  18.860000 ( 19.264533)
s.sub.sub:             9.880000   4.910000  14.790000 ( 14.945006)
s.strip!               2.750000   0.080000   2.830000 (  2.960402)
s.rstrip!.lstrip!:     2.670000   0.320000   2.990000 (  3.221094)
s.gsub!:              13.410000   6.490000  19.900000 ( 20.392547)
s.sub!.sub!:          10.260000   5.680000  15.940000 ( 16.411131)

3

Мое личное предпочтение заключается в использовании метода .tr

как в:

string = "this is a string to smash together"

string.tr(' ', '') # => "thisisastringtosmashtogether"

Спасибо @FrankScmitt за то, что он указал, что для удаления всех пробелов (не только пробелов) вам необходимо написать его так:

string = "this is a string with tabs\t and a \nnewline"

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"

но это только удаляет spaces, а неall white spaces
Гавриил

Чтобы удалить все пробелы (пробел, табуляция, новая строка), рассмотрите использование s.tr(" \t\n", '')вместо этого.
Фрэнк Шмитт

@ Гавриил - Я неправильно понял / неправильно понял вопрос, спасибо, что указали на это.
Джереми Гюнтер,

@FrankSchmitt Я добавил ваше исправление в мой ответ, чтобы более правильно ответить на вопрос ОП. Спасибо, что поправили меня.
Джереми Гюнтер,

3

Я пытался сделать это, так как хотел использовать «заголовок» записей в качестве идентификатора в представлении, но в заголовках были пробелы.

решение:

record.value.delete(' ') # Foo Bar -> FooBar

1

Руби .scan()и.join() методы String также могут помочь преодолеть пробелы в строке.

scan(/\w+/).join удалит все пробелы и присоединится к строке

string = "White spaces in me".scan(/\w+/).join
=>"Whitespacesinme"

Это также удаляет пробел в левой и правой части строки. Значит ltrim, rtrimа trim. На всякий случай, если у кого-то есть фон C, FoxProили Visual Basicи прыгать Ruby.

2.1.6 :002 > string = " White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :003 > string = " White spaces in me".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :004 > string = "White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :005 >


1
@AmitPandya Большое спасибо за указание на дополнительные ключевые моменты метода .scan (). Ценится !!!
Дхармеш Рупани


1

Я немного опоздал с игрой, но я удаляю пробел и ведущие пробелы, используя strip! . Если у вас есть массив, такой как у меня, мне нужно было перебрать массив и сохранить его после завершения экземпляра. ! позаботился об этом. Это удалило все пробелы в конце или начале, а не только первое или последнее трейлинг.

Например:

array = ["hello ","   Melanie", "is", " new ", "to  ", " programming"]
array.each do |i|
  i.strip!
end

Это вывело бы к: ["привет", "Мелани", "есть", "новый", "к", "программирование"]. Я также исследовал / поделился этим в видео, которое я сделал, чтобы выделить этот код для аналогичного вопроса, который у меня был .

Я новичок в программировании, и использование strip не сработало, поскольку оно не сохранило его в массив после завершения цикла.


0

Вы можете попробовать это:

"ab c d efg hi ".split.map(&:strip)

чтобы получить это:

["ab, "c", "d", "efg", "hi"]

или если вы хотите одну строку, просто используйте:

"ab c d efg hi ".split.join
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.