Ruby函数删除所有空格?

gpw*_*pwu 543 ruby string

删除所有空格的Ruby函数是什么?有点像php的trim()

joe*_*ely 821

如果你只想删除前导空格和尾随空格(比如PHP的修剪)你可以使用.strip,但是如果要删除所有空格,可以.gsub(/\s+/, "")改用.

  • \ s +表示1个或多个空格字符(空格,换行符,制表符).//周围显示它是一个正则表达式. (52认同)
  • @BrettHolt gsub表达式与trim不同,但提问者包含短语"all whitespace",这与trim也不同.所以我给了替代品. (14认同)
  • strip正是我想要的,感谢好问题和awnser! (6认同)
  • "/\s + /"简单是指空白吗? (4认同)
  • 这不等于trim() (3认同)
  • 另请注意,ActiveSupport(rails)添加了`String #remove(pattern)`,它是`String #gsubs(pattern,'')`的快捷方式(加上破坏性的`remove!`版本).非常方便. (3认同)
  • @LouisSayers 技术上是正确的。我的偏好是传达意图;“用空字符串替换所有空白字符”对我来说似乎比“用空字符串替换每个空白字符”更直接(并且可能是一个微不足道的字符串操作)。YMMV。 (2认同)

Ed *_* S. 482

s = "I have white space".delete(' ')
Run Code Online (Sandbox Code Playgroud)

并模拟PHP的trim()功能:

s = "   I have leading and trailing white space   ".strip
Run Code Online (Sandbox Code Playgroud)

  • @ckarbass @Ed S.它不是那么受欢迎,因为它不一样.原始问题使用短语"all whitespace",其中包括制表符,换行符等.这个建议的答案不会删除那些其他空白字符.至于"过于复杂",我建议将简单的正则表达式与`.delete('').delete('\ t').delete('\n')...`进行比较,这是过于冗长并提供了许多拼写错误和遗漏错误的机会. (92认同)
  • @ckarbass:因为很多人喜欢过于复杂的解决方案来处理简单问题.它消失了经验. (84认同)
  • @ joel.neely:很久以前我回答了这个问题,但是再次仔细阅读这个问题.OP要求*"删除所有空格的函数"*,但随后要求*"像PHP的trim()"*.因此,在这里确切地知道他们想要什么有点困难.`trim()`肯定不会删除换行符和其他空白字符.你选择了一个模糊问题的解释. (13认同)
  • 这比正则表达式更具可读性,为什么它不那么受欢迎? (12认同)
  • @ joel.neely:那就是说,我同意在这种情况下超出对问题的字面解释的解决方案是更好的解决方案(即,正则表达式删除所有将构成空格而不是字符串`delete()的字符`来电.) (4认同)
  • @Gavriel:是的,我很确定这是在六年半前完成的. (3认同)
  • @Bulwersator:如果这些都不是要求,那么你只是浪费时间来实现一个比你需要的更复杂的解决方案.YAGNI (2认同)

jrh*_*cks 160

相关回答:

"   clean up my edges    ".strip
Run Code Online (Sandbox Code Playgroud)

回报

"clean up my edges"
Run Code Online (Sandbox Code Playgroud)

  • 如果变量有可能是"nil",请确保在运行strip之前运行`.to_s`方法,以便strip方法不会引发错误.防爆.`STR =零; str.to_s.strip#=>""` (3认同)

ndn*_*kov 143

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空格.


注意:上述所有方法都返回一个新字符串,而不是改变原始字符串.如果要更改字符串,请!在最后调用相应的方法.

  • 只有这个答案中的最后一个例子抓住了可怕的 ASCII 160 '不间断空格',这是网络爬虫的祸根。`#strip` 没有。请参阅 /sf/ask/340160691/ (3认同)

rus*_*ils 93

"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"
Run Code Online (Sandbox Code Playgroud)

删除工作更快=)

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)
Run Code Online (Sandbox Code Playgroud)

  • 很好的回应.感谢您做基准测试. (3认同)
  • 但这仅删除了“空格”,而不是所有“空白” (2认同)

Rad*_*ika 81

你可以使用squish方法.它删除字符串两端的空白区域,并将多个空格分组为单个空格.

例如.

" a  b  c ".squish
Run Code Online (Sandbox Code Playgroud)

将导致:

"a b c"
Run Code Online (Sandbox Code Playgroud)

从api.rubyonrails.org查看此参考.

编辑:它只适用于铁轨上的红宝石

  • 这只适用于铁轨上的红宝石 (10认同)
  • 请注意,不鼓励[仅链接答案](http://meta.stackoverflow.com/tags/link-only-answers/info),SO答案应该是搜索解决方案的终点(相比之下)引用的另一个中途停留,随着时间的推移往往会变得陈旧.请考虑在此处添加独立的概要,并将链接作为参考. (4认同)
  • 这是来自ActiveSupport.你不需要所有的Rails都可以使用它,但你至少需要ActiveSupport和`require'active_support/core_ext/string/filters'` (4认同)
  • 我认为这个答案已经得到了足够的解释,并且链接是参考的事实,因为答案本身已经得到了明确的解释。这个功能不错,谢谢 (2认同)
  • 需要明确的是,这是_any_空白。例如 `"a \t \n \f \r \v b".squish == "a b"` (2认同)

Jul*_*and 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"
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用Rails的"squish"方法:http://apidock.com/rails/String/squish (31认同)
  • 或者,如果你没有Rails,并且你没有新行,那么`squeeze("")可能会起作用. (5认同)

sca*_*er2 45

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

要删除所有空格:

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"
Run Code Online (Sandbox Code Playgroud)

@Tass让我知道我的原始答案连续删除了重复的字母 - 你好!我已经改用了squish方法,如果使用Rails框架,这种方法更聪明.

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

"  good    men   ".squish
=> "good men"
Run Code Online (Sandbox Code Playgroud)

引用:http://apidock.com/rails/String/squish


小智 25

" Raheem Shaik ".strip
Run Code Online (Sandbox Code Playgroud)

它将删除左侧和右侧空间.这段代码会给我们:"Raheem Shaik"


Sap*_*ick 25

要删除两边的空格:

有点像 php 的 trim()

"   Hello  ".strip
Run Code Online (Sandbox Code Playgroud)

删除所有空格:

"   He    llo  ".gsub(/ /, "")
Run Code Online (Sandbox Code Playgroud)

要删除所有空格:

"   He\tllo  ".gsub(/\s/, "")
Run Code Online (Sandbox Code Playgroud)


Jus*_*cle 20

也别忘了:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]
Run Code Online (Sandbox Code Playgroud)

  • 所以s.split.join将完成这项工作. (5认同)

mah*_*off 19

split.join 会爆炸弦中任何地方的所有空间.

"  a b  c    d     ".split.join
> "abcd"
Run Code Online (Sandbox Code Playgroud)

它很容易输入和记忆,所以它在控制台和快速黑客上都很好.虽然因为它掩盖了意图,但严重的代码可能不受欢迎.

(基于Piotr在上面的Justicle答案中的评论.)


小智 10

你可以试试这个

"Some Special Text Values".gsub(/[[:space:]]+/, "")
Run Code Online (Sandbox Code Playgroud)

using :space:删除非破坏空间和常规空间.

  • 这实际上是最好的答案恕我直言,因为在野外 HTML ` ` 和任何其他非 ASCII 空格将 **not** 由 `String#strip` 删除或由 `/\s/` 匹配。请参阅 [Regexp docs](https://ruby-doc.org/core-2.4.2/Regexp.html) 中标题为“POSIX 括号表达式”的部分 (2认同)

euc*_*cas 7

使用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"
Run Code Online (Sandbox Code Playgroud)


小智 7

很多建议在这里都有效,但是当我读到你的问题和“删除所有空白”的具体行时,我想到的是:

" a b c " => "abc"
Run Code Online (Sandbox Code Playgroud)

如果这确实是所需要的,您可以执行这个简单的操作

" a b c " => "abc"
Run Code Online (Sandbox Code Playgroud)


edi*_*gat 6

"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"
Run Code Online (Sandbox Code Playgroud)


bdb*_*ger 6

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

a = "this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring
Run Code Online (Sandbox Code Playgroud)

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

另一个例子:

b = "the white fox has a torn tail"
Run Code Online (Sandbox Code Playgroud)

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

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


Mic*_*ill 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}"
Run Code Online (Sandbox Code Playgroud)

Ruby也有一个就地编辑版本,也称为String.strip!(注意尾随'!').这不需要创建字符串的副本,并且对于某些用途可以明显更快:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated  [#{string}]:#{string.length}"
Run Code Online (Sandbox Code Playgroud)

两个版本都生成此输出:

Original [  Many have tried; many have failed!    ]:40
Updated  [Many have tried; many have failed!]:34
Run Code Online (Sandbox Code Playgroud)

我创建了一个基准测试的一些基本应用的性能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
Run Code Online (Sandbox Code Playgroud)

这些是结果:

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)
Run Code Online (Sandbox Code Playgroud)