看起来你想要一个 sexeger。它们通过反转字符串,在字符串上运行反向正则表达式,然后将结果反转来工作。这里有一个例子(请原谅我的代码,我不真的知道 Ruby):
#!/usr/bin/ruby
s = "The quick red fox (frank,10) jumped over the lazy brown dog (ralph, 20).";
reversed_s = s.reverse;
reversed_s =~ /^.*?)(.*?)(/;
result = $1.reverse;
puts result;
The fact that this is getting no up votes tells me nobody clicked through to read why you want to use a sexeger, so here is are the results of a benchmark:
do they all return the same thing?
ralph, 20
ralph, 20
ralph, 20
ralph, 20
user system total real
scan greedy 0.760000 0.000000 0.760000 ( 0.772793)
scan non greedy 0.750000 0.010000 0.760000 ( 0.760855)
right index 0.760000 0.000000 0.760000 ( 0.770573)
sexeger non greedy 0.400000 0.000000 0.400000 ( 0.408110)
这里是基准:
#!/usr/bin/ruby
require benchmark
def scan_greedy(s)
result = s.scan(/([^)]*)/x)[-1]
result[1 .. result.length - 2]
end
def scan_non_greedy(s)
result = s.scan(/(.*?)/)[-1]
result[1 .. result.length - 2]
end
def right_index(s)
s[s.rindex( ( ) + 1 .. s.rindex( ) ) -1]
end
def sexeger_non_greedy(s)
s.reverse =~ /^.*?)(.*?)(/
$1.reverse
end
s = "The quick red fox (frank,10) jumped over the lazy brown dog (ralph, 20).";
puts "do they all return the same thing?",
scan_greedy(s), scan_non_greedy(s), right_index(s), sexeger_non_greedy(s)
n = 100_000
Benchmark.bm(18) do |x|
x.report("scan greedy") { n.times do; scan_greedy(s); end }
x.report("scan non greedy") { n.times do; scan_non_greedy(s); end }
x.report("right index") { n.times do; scan_greedy(s); end }
x.report("sexeger non greedy") { n.times do; sexeger_non_greedy(s); end }
end