在Ruby中-如何获得gsub!(bang)如果不返回nil';t匹配并使其表现为.gsub

在Ruby中-如何获得gsub!(bang)如果不返回nil';t匹配并使其表现为.gsub,ruby,regex,Ruby,Regex,假设我想从字符串中删除前导空格 a = " Hello world" puts a.gsub!(/^ /,"") # => "Hello World" 但是如果字符串中没有前导空格 b = "Hello World" puts a.gsub!(/^ /,"") # => nil 现在,如果我只使用gsub而不是gsub,它将返回字符串: puts b.gsub(/^ /,"") # => "Hello World" puts a.gsub(/^ /,"") # =>

假设我想从字符串中删除前导空格

a = " Hello world"
puts a.gsub!(/^ /,"") # => "Hello World"
但是如果字符串中没有前导空格

b = "Hello World" 
puts a.gsub!(/^ /,"") # => nil
现在,如果我只使用gsub而不是gsub,它将返回字符串:

puts b.gsub(/^ /,"") # => "Hello World"
puts a.gsub(/^ /,"") # => "Hello World" (works for both a and b)
所以有可能得到gsub!要像上面所示那样执行gsub吗

原因是gsub每次都会创建一个新对象,我希望避免这样做,因为我将在需要操作的字符串上使用至少4或5个gsub


谢谢,这里有两种方法

|a
添加到
gsub
表达式中

a.gsub!(/\A\s/,"") || a
将为您提供所需的结果,即删除空格(如果存在),并在进行任何更改后返回字符串。如果不做任何更改,这将减少到
nil | | a#=>a
。如果进行了更改,表达式将缩减为
a.gsub!(/\A\s/,“”)
。比如说,

a = " Hello"
a.gsub!(/\A\s/,"") || a      #=> "Hello" 
a                            #=> "Hello"

a ="Hello"
a.gsub!(/\A\s/,"") || a      #=> "Hello" 
a                            #=> "Hello" 
虽然这里没有区别,但我更喜欢使用字符串锚点的开头,
\A
,而不是行锚点的开头,
^
,我也更喜欢使用空白字符
\s
而不是空格(假设它不能是制表符)而不是空格,因为无意中的额外空格可能不会被注意到

使用和无损检测方法

答复:

b.gsub!(/(^)?/,“”)=>“你好,世界”

说明:

(…)捕获随附的所有内容

a?零或一个

-通过

例如:

irb(main):008:0> a = " Hello World"
=> " Hello World"
irb(main):009:0> b = "Hello World"
=> "Hello World"
irb(main):010:0> a.gsub!(/(^ )?/,"")
=> "Hello World"
irb(main):011:0> b.gsub!(/(^ )?/,"")
=> "Hello World"

备选方案:


b.gsub!(/^ |/,“”)#=>“Hello World”
使用”或“pipe char”

下面的代码向String类添加了一个方法,该方法只调用gsub!然后返回调用它的字符串对象。所以如果gsub!是“成功”的,并且某个对象已被子对象。它返回子对象字符串。否则它将返回原始字符串

class String
  def filled_gsub!(oldsubstr, newsubstr)
    gsub!(oldsubstr, newsubstr)
    self
  end
end

使用零个或多个量词:
放置b.gsub!(/^*/,“”)
我想你误解了gsub的设计目的是,您不必关心返回此方法的内容,目标是在适当的位置更改字符串。如果您想要捕获方法返回,请使用
gsub
@WiktorStribiżew谢谢,但是替换一个单词怎么样,例如
a=“Hello World”;b=“你好”;a、 gsub!(“世界”,“野生”)#=>“你好,野生”;b、 gsub!(“世界”、“野生”)#=>nil(这里需要“Hello”)
@casimirithippolyte我应该不担心它每次都创建对象吗?这些只是小字符串。请看我想指出的一个风格和惯例提示:“在可以使用更快更专业的替代方案的情况下,不要使用
String#gsub
。-谢谢。实际上,我的字符串稍微复杂一些,我只是想给出一个简单的例子。
class String
  def filled_gsub!(oldsubstr, newsubstr)
    gsub!(oldsubstr, newsubstr)
    self
  end
end