Ruby函数删除所有空格?


573

删除所有空格的Ruby函数是什么?我在寻找类似PHP的东西trim()吗?


36
您的问题尚不清楚:您要删除所有空格还是要摆脱开头和结尾的空格?
SinanÜnür2009年

25
PHP的trim()带空白“ 从一开始就和一个字符串结束 ”(如内声明的文件),它不会删除“所有的空格”。
塔德克2012年

3
如有疑问,请查看Ruby在线文档中的String类(请参见下面的.strip)。
Merovex13年

2
请注意,所有使用String#strip或匹配的答案/\s+/都只会删除ASCII空格。如果您也想确保也捕获到任何非ASCII空格(例如HTML的空格&nbsp),请参阅@EBooker奇怪的不受欢迎的答案。
MatzFan

1
可惜的是,如此出色的答案无法使一个人获得最终的尊严
新亚历山大

Answers:


846

如果您只想删除开头和结尾的空格(例如PHP的修剪),则可以使用.strip,但如果要删除所有空格,则可以使用.gsub(/\s+/, "")


5
“ / \ s + /”简单表示空格吗?
Rails初学者,

54
\ s +表示1个或多个空格字符(空格,换行符,制表符)。//周围表明它是一个正则表达式。
dylanfm 2011年

3
这不等于trim()
Brett Holt 2012年

6
正是我一直在寻找脱衣舞娘,谢谢你的提问和篷!
弗朗索瓦·

15
@BrettHolt gsub表达式与trim不相同,但发问者包括短语“ all whitespace”,也与trim不相同。所以我给了替代方案。
joel.neely 2012年

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

并模拟PHP的trim()功能:

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

12
这比正则表达式更具可读性,为什么它不那么受欢迎?
ckarbass

89
@ckarbass:因为许多人喜欢过于复杂的解决方案而不是简单的问题。它随着经验而消失。
Ed S.

97
@ckarbass @EdS。它不那么受欢迎,因为它不一样。最初的问题使用了短语“所有空格”,其中包括制表符,换行符等。建议的答案不会删除那些其他空格字符。对于“过于复杂”,我建议将简单的正则表达式与进行比较.delete(' ').delete('\t').delete('\n') ...,因为它过于冗长,为错别字和遗漏错误提供了很多机会。
joel.neely 2012年

13
@ joel.neely:很久以前我回答了这个问题,但是这次又仔细阅读了这个问题。OP要求“删除所有空白的函数”,但是要求“类似PHP的trim()”。因此,确切地知道他们在这里想要什么有点困难。 trim()当然不会删除换行符和其他空格字符。您正在为一个模糊的问题选择一种解释。
Ed S.

4
@ joel.neely:就是说,我同意,在这种情况下,超出问题的字面解释范围的解决方案是更好的解决方案(即,使用正则表达式删除所有将构成空格的字符,而不是delete()调用字符串)
Ed S.

163

相关答案:

"   clean up my edges    ".strip

退货

"clean up my edges"

那就是我忘记的那个。我知道有一种删除空白的方法,如果没有传递任何参数,默认情况下会这样做。+1
Ed S.

这等效于修剪。请参考上面@Tadeck的报价。
Brett Holt

3
如果变量可能是nil,请确保.to_s在运行strip之前先运行method,以使strip方法不会引发错误。例如 str=nil; str.to_s.strip #=> ""
scarver2 2012年

我更喜欢some_data.strip!如果some_data.is_a?琴弦
slindsey3000 '18

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:]]/, '')删除所有空白,包括unicode


注意:上面所有方法都返回一个新字符串,而不是对原始字符串进行突变。如果要在适当位置更改字符串,请!在末尾调用相应的方法。


String#delete示例似乎使用了正则表达式,但使用\s引号而不是斜杠。另外,我在文档中找不到任何提及delete可以使用正则表达式作为参数的内容。
slothbear

@slothbear,它不是正则表达式,而是一小组类似于正则表达式的模式。至于文档#delete,据说工作类似#count。您也可以在控制台中尝试。
ndnenkov

感谢您教我一些新知识。同时也感谢您提醒我们在尽可能小的上下文中尝试操作(命令行)。
slothbear

1
@SeinopSys我只想保留Ruby。
ndnenkov

2
仅此答案中的最后一个示例捕获了可怕的ASCII 160“不间断空间”,这是Web刮板的祸根。#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
Gavriel

1
delete(" \t\r\n")将处理典型的空白,并且仍然比gsub快。
塞思·杰弗里

94

如果使用Rails / ActiveSupport,则可以使用squishmethod。它将删除字符串两端的空白并将多个空白分组为单个空格。

例如。

" a  b  c ".squish

将导致:

"a b c"

从api.rubyonrails.org中检查此参考


4
请注意,不鼓励仅链接的答案,因此SO答案应该是搜索解决方案的终点(与引用的另一种中途停留相比,随着时间的流逝,它们往往会过时)。请考虑在此处添加独立的摘要,并保留该链接作为参考。
kleopatra

2
我认为这个答案已经足够解释了,因为答案本身很明确,所以链接是参考。这项功能很好,谢谢
ksugiarto

4
这是来自ActiveSupport。您不需要所有的Rails即可使用它,但至少需要ActiveSupport和require 'active_support/core_ext/string/filters'
Justin Force

2
要明确的是,这是任何空格。例如"a \t \n \f \r \v b".squish == "a b"
Purplejacket

47

有点晚了,但是其他使用此页面的人可能对此版本感兴趣-

如果您想清理用户可能以某种方式剪切并粘贴到您的应用程序中的一部分预格式化文本,但保留字间距,请尝试以下操作:

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
一个人也可以使用Rails的squish方法:apidock.com/rails/String/squish
Phillip Koebbe,2012年

5
或者,如果您没有Rails,也没有换行符,则squeeze(" ")可能会起作用。
安德鲁·格林

45

Ruby的.strip方法执行的PHP等效于trim()

删除所有空格:

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

@Tass让我知道我的原始答案连续删除了重复的字母-哎呀!从那以后,我已经切换到squish方法,如果使用Rails框架,这种方法会更聪明。

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"
塔斯(Tass)2013年

1
感谢您指出@Tass。我已经编辑了我的答案,以支持压缩方法。
scarver2 2013年

1
+1表示“连续重复字母”。我无法提出一种描述场景的方法。做得好!:-)
塔斯(Tass),

26
" Raheem Shaik ".strip

它将删除左侧和右侧的空格。该代码将为我们提供:"Raheem Shaik"


20

另外请不要忘记:

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

6
因此s.split.join将完成这项工作。
Piotr Brudny 2012年

1
迭代时很好:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
tbloncar 2014年

20

split.join 将爆炸字符串中任何位置的所有空格。

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

它易于键入和记住,因此在控制台上非常有用,并且可以快速进行黑客攻击。尽管它掩盖了意图,但可以说在严格的代码中不受欢迎。

(基于Piotr在以上Justicle的回答中的评论。)


1
非常感谢您的评论:-)这是唯一的方法,如果您有一个长的字符串,看起来像一个段落。
Boomerange

12

你可以试试这个

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

使用:space:删除不间断的空格以及常规空格。


1
实际上,这是最好的答案,恕我直言,因为在野生HTML &nbsp和其他任何非ASCII空格中,不会被删除String#strip或匹配/\s/。请参阅Regexp文档
MatzFan

8

使用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"

8

有很多方法:
从两面删除空格:

有点像php的trim()

Foo_bar.strip

要删除所有空格:

Foo_bar.gsub(/ /, "")

删除所有空格:

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

6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"

但这仅会删除一部分spaces,而不是全部删除white spaces
Gavriel

6

gsub方法就可以了。
可以在字符串上调用gsub方法,并说:

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

gsub方法搜索第一个参数的每次出现,并将其替换为第二个参数。在这种情况下,它将替换字符串中的每个空格并将其删除。

另一个例子:

b = "the white fox has a torn tail"

让我们用大写字母“ T”代替每次出现的字母“ t”

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

我创建了一个基准测试的一些基本应用的性能stripstrip!,以及一些替代品。测试是这样的:

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

我尝试执行此操作,因为我想在视图中使用记录“ title”作为ID,但是标题中有空格。

一个解决方案是:

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

2

我个人的喜好是使用方法 .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
Gavriel

要删除所有空格(空格,制表符,换行符),请考虑使用s.tr(" \t\n", '')代替。
Frank Schmitt'2

@Gavriel-我误读/误解了这个问题,谢谢你指出这个问题。
杰里米·甘特

@FrankSchmitt我在您的答案中添加了更正,以更正确地回答OP的问题。谢谢你纠正我。
杰里米·甘特

1

Ruby的.scan().join() String方法也可以帮助克服字符串中的空白。

scan(/\w+/).join 将删除所有空格并加入字符串

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

它还正在删除字符串左右部分的空间。手段ltrimrtrimtrim。以防万一某人有背景CFoxProVisual 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()方法的其他要点。赞赏!
Dharmesh Rupani


1

我玩游戏有点晚了,但是我使用删除了尾随空格和前导空格strip!。如果像我一样有一个数组,我需要遍历该数组并在实例结束后保存它。!照顾了这个。这删除了末尾或开头的所有空格,而不仅仅是第一个前导或最后一个结尾。

例如:

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

这将输出为:[“ hello”,“ Melanie”,“ is”,“ new”,“ to”,“ programming”]。我在制作的视频中进一步探讨/分享了该视频,以突出我遇到的类似问题的代码

我是编程新手,由于循环结束后未将其保存到数组,因此使用strip无法正常工作。


0

您可以尝试以下方法:

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

为了得到这个:

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

或者,如果您想使用单个字符串,则只需使用:

"ab c d efg hi ".split.join
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.