Ruby如何删除字符串中的重复正则表达式

时间:2015-01-23 03:49:23

标签: ruby regex string

对于像

这样的字符串
s = "(string1) this is text (string2) that's separated (string3)"

我需要一种方法来删除它们中的所有括号和文本,但是如果我使用以下内容它将返回一个空字符串

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

我可以用什么来获得以下内容?

" this is text  that's separated "

3 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

s.gsub(/\(.*?\)/,'')
  # => " this is text  that's separated "

正则表达式中的?是使其“非贪婪”。没有它,如果:

s = "A: (string1) this is text (string2) that's separated (string3) B"

然后

s.gsub(/\(.*\)/,'')
  #=> "A:  B" 

编辑:我为各种方法运行了以下基准测试。你会发现有一个重要的外卖。

n = 10_000_000
s = "(string1) this is text (string2) that's separated (string3)"

Benchmark.bm do |bm|
  bm.report 'sawa' do
    n.times { s.gsub(/\([^()]*\)/,'') }
  end 
  bm.report 'cary' do
    n.times { s.gsub(/\(.*?\)/,'') }
  end 
  bm.report 'cary1' do
    n.times { s.split(/\(.*?\)/).join }
  end 
  bm.report 'sawa1' do
    n.times { s.split(/\([^()]*\)/).join }
  end 
  bm.report 'sawa!' do
    n.times { s.gsub!(/\([^()]*\)/,'') }
  end
  bm.report '' do
    n.times { s.gsub(/\([\w\s]*\)/, '') }
  end
end

              user     system      total        real
sawa        37.110000   0.070000  37.180000 ( 37.182598)
cary        37.000000   0.060000  37.060000 ( 37.066398)
cary1       35.960000   0.050000  36.010000 ( 36.009534)
sawa1       36.450000   0.050000  36.500000 ( 36.503711)
sawa!        7.630000   0.000000   7.630000 (  7.632278)
user1179871 38.500000   0.150000  38.650000 ( 38.666955)

我多次运行基准测试,结果差异很大。在某些情况下,sawa比cary略快。

[编辑:我在上面的基准测试中添加了@ user1179871方法的修改版本,但没有更改我的答案的任何文本。在@ user1179871的答案评论中描述了修改。它看起来稍慢sawacary,但情况可能并非如此,因为基准时间因运行而异,我对新方法进行了单独的基准测试。

答案 1 :(得分:2)

Cary的回答是简单的方法。这个答案是有效的方法。

s.gsub(/\([^()]*\)/, "")

要记住:非贪婪匹配需要回溯,一般来说,如果可以,最好不要使用它。但是对于这么简单的任务,卡里的答案已经足够好了。

答案 2 :(得分:0)

试试吧

string.gsub(/\({1}\w*\){1}/, '')