2009-10-28 4 views
452

Что такое функция Ruby для удаления все пустое место? Вид как php's trim()?Функция Ruby для удаления всех пробелов?

+27

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

+17

PHP ['trim()'] (http://php.net/manual/en/function.trim.php) разделяет пробелы "_ от начала и конца строки_" (как указано в [документации] (http: //php.net/manual/en/function.trim.php)), он не удаляет «все пробелы». – Tadeck

+1

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

ответ

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

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

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

Это гораздо читательнее, чем регулярное выражение, почему оно не так популярно? – ckarbass

+75

@ckarbass: Потому что многие люди предпочитают слишком сложные решения для простых задач. Он уходит с опытом. –

+0

Я думаю, это потому, что многие люди на самом деле ищут полосу. Даже тот, который упоминает только полосу, выше этой записи. –

149

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

" clean up my edges ".strip 

возвращает

"clean up my edges" 
+0

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

+0

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

+3

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

18

Также не стоит забывать:

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

Так что s.split.join выполнит эту работу. –

+1

Это хорошо, когда итерация: '[" Hello World "," Big Giraffe "] .map (&: split) .map (&: join) # => [" HelloWorld "," BigGiraffe "]' – tbloncar

723

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

+4

Делает ли "/ \ s +/"простые средние пробелы? –

+46

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

+2

Это не соответствует обрезке() –

46

Это немного поздно, но кто-то прибегая к помощи этой страницы могут быть заинтересованы в этой версии -

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

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" 
+30

Можно также использовать метод «squish» Rails: http://apidock.com/rails/String/squish –

+5

Или, если у вас нет Rails, и у вас нет линий новой строки, 'squeeze (" ")' может работать. –

43

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

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

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

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

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

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

Cite: http://apidock.com/rails/String/squish

+1

Это приведет к удалению «соединенных» дубликатов символов. '« хорошие люди ».squeeze.strip' вернут« боги »' – Tass

+1

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

+1

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

83
"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) 
+2

Отличный ответ. Спасибо, что сделали тест. –

+1

, но это удаляет только «пробелы», а не все «белые пробелы» – Gavriel

7
"asd sda sda sd".gsub(' ', '') 
=> "asdsdasdasd" 
+0

, но это удаляет только «пробелы», а не все «белые пробелы» – Gavriel

25
" Raheem Shaik ".strip 

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

67

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

Для примера.

" a b c ".squish 

приведет к:

"a b c" 

Проверьте this reference from api.rubyonrails.org.

EDIT: Он работает только для рубина на рельсах

+4

. Обратите внимание, что [ссылки только ответы] (http://meta.stackoverflow.com/ теги/ссылки-только-ответы/информация) не рекомендуется, SO-ответы должны быть конечной точкой поиска решения (против еще одной остановки ссылок, которые со временем устаревают). Пожалуйста, подумайте о добавлении отдельного резюме здесь, сохранив ссылку в качестве ссылки. – kleopatra

+1

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

+9

Это работает только в рубине на рельсах –

15

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

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

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

(Основано на комментарий Петр в Justicle's answer выше.)

+1

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

3

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

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

использованием : пространство: удаляет неразрывный пробел наряду с регулярным пространством.

+0

Это на самом деле лучший ответ IMHO, так как в диком HTML '& nbsp' и любые другие пробелы, отличные от ASCII, ** не будут удаляться' String # strip' или совпадают с '/ \ s /'. См. Раздел «Выражения скобок POSIX» в [Regexp docs] (https://ruby-doc.org/core-2.4.2/Regexp.html) – MatzFan

5

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

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" 
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" 
+0

, но это удаляет только «пробелы», а не «все пробелы» ' – Gavriel

+0

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

+0

@ Gavriel - я неправильно понял/неправильно понял вопрос, спасибо за указание на это. –

2

Ruby's .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(). Оцените !!! –

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}" 

Рубин также имеет редактирование на месте версию, а также, 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) 
75

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:]]/, '') - удаляет все пробелы, в том числе unicode ones.


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

+0

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

+0

@slothbear, это не регулярное выражение, это небольшой набор шаблонов, которые напоминают регулярные выражения. Что касается документации ['# delete'] (https://ruby-doc.org/core-2.4.0/String.html#method-i-delete), как говорят, работает аналогично [' # count'] (https://ruby-doc.org/core-2.4.0/String.html#method-i-count).Вы можете попробовать его и в консоли. – ndn

+0

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

2

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

решение является:

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

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

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

для того, чтобы получить это:

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

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

"ab c d efg hi ".split.join 
2

Я хотел бы использовать что-то вроде этого:

my_string = "Foo bar\nbaz quux" 

my_string.split.join 
=> "Foobarbazquux" 
+0

прямо. благодаря –

2

Метод 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 
Смежные вопросы