在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