对于像
这样的字符串s = "(string1) this is text (string2) that's separated (string3)"
我需要一种方法来删除它们中的所有括号和文本,但是如果我使用以下内容它将返回一个空字符串
s.gsub(/\(.*\)/, "")
我可以用什么来获得以下内容?
" this is text that's separated "
答案 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的答案评论中描述了修改。它看起来稍慢sawa
和cary
,但情况可能并非如此,因为基准时间因运行而异,我对新方法进行了单独的基准测试。
答案 1 :(得分:2)
Cary的回答是简单的方法。这个答案是有效的方法。
s.gsub(/\([^()]*\)/, "")
要记住:非贪婪匹配需要回溯,一般来说,如果可以,最好不要使用它。但是对于这么简单的任务,卡里的答案已经足够好了。
答案 2 :(得分:0)
试试吧
string.gsub(/\({1}\w*\){1}/, '')