Ваш вопрос не ясен: вы хотите удалить все пробелы или вы хотите избавиться от ведущих и конечных пробелов?
Синан Юнюр
25
PHP trim()удаляет пробелы « от начала и конца строки » (как указано в документации ), он не удаляет «все пробелы».
Tadeck
3
Если вы сомневаетесь, посмотрите онлайн-документацию по Ruby для класса String (см. Стр. Ниже).
Меровекс
2
Обратите внимание, что все ответы, использующие String#stripили соответствующие /\s+/, удаляют только пробелы ASCII. Если вы хотите убедиться, что все не-ASCII пробелы тоже перехвачены (например, HTML  ), посмотрите странно непопулярный ответ от @EBooker.
MatzFan
1
Жаль, что такие великие ответы не могут получить окончательного достоинства того, кто был принят
Новая Александрия
Ответы:
846
Если вы хотите удалить только начальные и конечные пробелы (например, обрезку PHP), вы можете использовать их .strip, но если вы хотите удалить все пробелы, вы можете использовать .gsub(/\s+/, "")вместо них.
\ 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
это гораздо более читабельно, чем регулярное выражение, почему это не так популярно?
Карбасс
89
@ckarbass: потому что многие люди предпочитают слишком сложные решения простых проблем. Уходит с опытом.
Эд С.
97
@ckarbass @Ed S. Это не так популярно, потому что это не то же самое. В первоначальном вопросе использовалась фраза «все пробелы», которая включает в себя вкладки, новые строки и т. Д. Этот предложенный ответ не удалит эти другие пробельные символы. Что касается «чрезмерно сложного», я предлагаю сравнить простое регулярное выражение с .delete(' ').delete('\t').delete('\n') ..., которое является слишком многословным и предоставляет много возможностей для опечаток и ошибок пропуска.
joel.neely
13
@ joel.neely: я ответил на этот вопрос давным-давно, но прочитал вопрос еще раз, на этот раз более внимательно. ОП запросил «функцию для удаления всех пробелов» , но затем попросил «что-то вроде PHP trim ()» . Так что немного сложно точно знать, чего они хотят здесь. trim()конечно, не удаляет символы новой строки и другие пробельные символы. Вы выбираете одну интерпретацию расплывчатого вопроса.
Эд С.
4
@ joel.neely: Тем не менее, я согласен, что решение, которое выходит за рамки буквального толкования вопроса, является лучшим в этом случае (т. е. регулярное выражение, удаляющее все символы, которые составляют пробел, а не строку delete()вызовов).
Это тот, о котором я забыл. Я знал, что есть метод для удаления пробелов, который будет делать это по умолчанию, если не было передано никаких аргументов. +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 # использует регулярное выражение, но \sв кавычках вместо косых черт. Также я не смог найти упоминаний в документации, что delete может принимать регулярное выражение в качестве аргумента.
ленивец
@slothbear, это не регулярное выражение, это небольшой набор шаблонов, которые напоминают регулярные выражения. Что касается документации, #deleteкак говорят, работает аналогично #count. Вы также можете попробовать это в консоли.
ndnenkov
Спасибо, что научил меня чему-то новому. А также спасибо за напоминание, чтобы попробовать вещи в наименьшем возможном контексте (командная строка).
ленивец
1
@SeinopSys Я хотел оставить этот ответ только Ruby.
ndnenkov
2
Только последний пример в этом ответе ловит ужас ASCII 160 «неразрывное пространство», проклятие веб-скребков. #stripне. См stackoverflow.com/questions/4859438/...
user system total real
gsub, s 0.1800000.0100000.190000(0.193014)
gsub, s+0.2000000.0000000.200000(0.196408)
gsub, space 0.2200000.0000000.220000(0.222711)
gsub, join 0.2000000.0000000.200000(0.193478)
delete 0.0400000.0000000.040000(0.045157)
delete(" \t\r\n")позаботится о типичных пробелах, и все еще быстрее, чем gsub.
Сет Джеффри
94
Если вы используете Rails / ActiveSupport , вы можете использовать squishметод. Он удаляет пробелы на обоих концах строки и группирует несколько пробелов в один пробел.
Обратите внимание, что ответы только на ссылки не приветствуются, поэтому ответы 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"
Или, если у вас нет 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"
Это хорошо при повторении:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar
20
split.join взорвет все пробелы в любом месте строки.
" a b c d ".split.join
>"abcd"
Его легко набирать и запоминать, поэтому он удобен для консоли и для быстрого взлома. Возможно не приветствуется в серьезном коде, хотя, поскольку он маскирует намерение.
На самом деле это лучший ответ IMHO, так как в диком HTML  и любых других пробелах, не относящихся к 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"
Для поведения, точно совпадающего с 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!]:40Updated[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.6900000.3200003.010000(4.048079)
s.rstrip.lstrip:2.7900000.0600002.850000(3.110281)
s.gsub:13.0600005.80000018.860000(19.264533)
s.sub.sub:9.8800004.91000014.790000(14.945006)
s.strip!2.7500000.0800002.830000(2.960402)
s.rstrip!.lstrip!:2.6700000.3200002.990000(3.221094)
s.gsub!:13.4100006.49000019.900000(20.392547)
s.sub!.sub!:10.2600005.68000015.940000(16.411131)
Руби .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 >
Я немного опоздал с игрой, но я удаляю пробел и ведущие пробелы, используя strip! . Если у вас есть массив, такой как у меня, мне нужно было перебрать массив и сохранить его после завершения экземпляра. ! позаботился об этом. Это удалило все пробелы в конце или начале, а не только первое или последнее трейлинг.
trim()
удаляет пробелы « от начала и конца строки » (как указано в документации ), он не удаляет «все пробелы».String#strip
или соответствующие/\s+/
, удаляют только пробелы ASCII. Если вы хотите убедиться, что все не-ASCII пробелы тоже перехвачены (например, HTML 
), посмотрите странно непопулярный ответ от @EBooker.Ответы:
Если вы хотите удалить только начальные и конечные пробелы (например, обрезку PHP), вы можете использовать их
.strip
, но если вы хотите удалить все пробелы, вы можете использовать.gsub(/\s+/, "")
вместо них.источник
И подражать
trim()
функции PHP :источник
.delete(' ').delete('\t').delete('\n') ...
, которое является слишком многословным и предоставляет много возможностей для опечаток и ошибок пропуска.trim()
конечно, не удаляет символы новой строки и другие пробельные символы. Вы выбираете одну интерпретацию расплывчатого вопроса.delete()
вызовов).Связанный ответ:
возвращается
источник
nil
, обязательно запустите.to_s
метод перед запуском strip, чтобы метод strip не вызывал ошибку. Ex.str=nil; str.to_s.strip #=> ""
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:]]/, '')
- удаляет все пробелы, в том числе Юникода из них .Примечание . Все приведенные выше методы возвращают новую строку, а не изменяют оригинал. Если вы хотите изменить строку на месте, вызовите соответствующий метод с
!
в конце.источник
\s
в кавычках вместо косых черт. Также я не смог найти упоминаний в документации, что delete может принимать регулярное выражение в качестве аргумента.#delete
как говорят, работает аналогично#count
. Вы также можете попробовать это в консоли.#strip
не. См stackoverflow.com/questions/4859438/...Удалить работает быстрее =)
источник
spaces
, не всеwhite spaces
delete(" \t\r\n")
позаботится о типичных пробелах, и все еще быстрее, чем gsub.Если вы используете Rails / ActiveSupport , вы можете использовать
squish
метод. Он удаляет пробелы на обоих концах строки и группирует несколько пробелов в один пробел.Например,
приведет к:
Проверьте эту ссылку от api.rubyonrails.org .
источник
require 'active_support/core_ext/string/filters'
"a \t \n \f \r \v b".squish == "a b"
Уже немного поздно, но любой другой, кто ищет эту страницу в Google, может заинтересоваться этой версией -
Если вы хотите очистить часть предварительно отформатированного текста, который пользователь мог каким-то образом вырезать и вставить в ваше приложение, но сохранить интервал между словами, попробуйте следующее:
источник
squish
метод Rails : apidock.com/rails/String/squishsqueeze(" ")
может сработать..strip
Метод Руби выполняет PHP-эквивалентtrim()
.Чтобы удалить все пробелы:
@Tass дал мне понять, что мой первоначальный ответ удаляет повторяющиеся буквы подряд - YUCK! С тех пор я переключился на метод squish, который более умен в таких случаях, если использовать Rails Framework.
Цитировать: http://apidock.com/rails/String/squish
источник
"good men".squeeze.strip
вернется"god men"
Это удалит левый и правый боковые пространства. Этот код даст нам:
"Raheem Shaik"
источник
Также не забывайте:
источник
[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
split.join
взорвет все пробелы в любом месте строки.Его легко набирать и запоминать, поэтому он удобен для консоли и для быстрого взлома. Возможно не приветствуется в серьезном коде, хотя, поскольку он маскирует намерение.
(На основании комментария Петра в ответе Юстикла выше.)
источник
Вы могли бы попробовать это
using : space: удаляет неразрывный пробел вместе с обычным пробелом.
источник
 
и любых других пробелах, не относящихся к ASCII, они не будут удаленыString#strip
или сопоставлены/\s/
. См. Раздел «Выражения в скобках POSIX» в документахИспользуйте gsub или удалите. Разница в том, что gsub может удалить вкладки, а удалить - нет. Иногда у вас есть вкладки в файлах, которые добавляются редакторами.
источник
Есть много способов:
удалить пробелы с обеих сторон:
Чтобы удалить все пробелы:
Чтобы удалить все пробелы:
источник
источник
spaces
, не всеwhite spaces
Метод gsub подойдет просто отлично.
Метод gsub может быть вызван на строку и говорит:
Метод gsub ищет каждое вхождение первого аргумента и заменяет его вторым аргументом. В этом случае он заменит все пробелы в строке и удалит ее.
Другой пример:
Заменим каждое вхождение буквы «т» на заглавную «Т»
источник
Для поведения, точно совпадающего с PHP
trim
, самый простой метод - использоватьString#strip
метод, например так:Ruby также имеет версию для редактирования на месте, которая также называется
String.strip!
(обратите внимание на завершающий символ '!'). Это не требует создания копии строки и может быть значительно быстрее для некоторых целей:Обе версии производят этот вывод:
Я создал бенчмарк для тестирования производительности некоторых основных применений
strip
иstrip!
, а также некоторых альтернатив. Тест такой:Вот результаты:
источник
Мое личное предпочтение заключается в использовании метода
.tr
как в:
Спасибо @FrankScmitt за то, что он указал, что для удаления всех пробелов (не только пробелов) вам необходимо написать его так:
источник
spaces
, а неall white spaces
s.tr(" \t\n", '')
вместо этого.Я пытался сделать это, так как хотел использовать «заголовок» записей в качестве идентификатора в представлении, но в заголовках были пробелы.
решение:
источник
Руби
.scan()
и.join()
методы String также могут помочь преодолеть пробелы в строке.scan(/\w+/).join
удалит все пробелы и присоединится к строкеЭто также удаляет пробел в левой и правой части строки. Значит
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 >
источник
Я бы использовал что-то вроде этого:
источник
Я немного опоздал с игрой, но я удаляю пробел и ведущие пробелы, используя
strip!
. Если у вас есть массив, такой как у меня, мне нужно было перебрать массив и сохранить его после завершения экземпляра. ! позаботился об этом. Это удалило все пробелы в конце или начале, а не только первое или последнее трейлинг.Например:
Это вывело бы к: ["привет", "Мелани", "есть", "новый", "к", "программирование"]. Я также исследовал / поделился этим в видео, которое я сделал, чтобы выделить этот код для аналогичного вопроса, который у меня был .
Я новичок в программировании, и использование strip не сработало, поскольку оно не сохранило его в массив после завершения цикла.
источник
Вы можете попробовать это:
чтобы получить это:
или если вы хотите одну строку, просто используйте:
источник