합니다. 그들은 문자열을 역전시키고 문자열에 대해 역 정규식을 실행 한 다음 결과를 반대로 작업합니다.
#!/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;
이 더까지 투표를 받고되지 않는다는 사실은 나를 아무도 당신이 sexeger를 사용하려는 이유 읽기를 통해 클릭하지 알 수 있으므로, 예를 들면 다음과 같습니다 (난 정말 루비를 모르는 코드를 용서)입니다 여기
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
신난다! ... 나는 그것을 foo.scan (/\(.*,*.*\)/)[- 1]로 바 꾸었습니다. 왜냐하면 실제로 그것을 예제 문자 유형으로 제한 할 필요가 없기 때문입니다. 감사합니다 – Streamline
s.scan (/\(.*?\)/)[-1]; 더 쉬워? –
또는 욕심이없는 성냥이 마음에 들지 않으면 s.scan (/ \ ([^]) * \) /) [- 1]. –