当要在正则表达式中捕获的模式与锚点相邻时,无论是否捕获,都不会影响捕获的字符串。在以下(Ruby)正则表达式对中,
/(\Afoo)bar/
/\A(foo)bar/
/foo(bar\z)/
/foo(bar)\z/
/foo(^bar)baz/
/foo^(bar)baz/
/foo(bar$)baz/
/foo(bar)$baz/
结果是一样的。从性能上来说,是否最好在捕获中包含锚点,还是没有区别?
从实际的角度来看,您提供的对与相同。要点是,锚是零宽度的断言,它们匹配空字符串:/(\Afoo)bar/
并且在存储在组1中时将在字符串的开头/\A(foo)bar/
匹配foobar
,依此类推foo
。
从逻辑角度来看,生产力应该没有差别,因为行/字符串的开头(^
,\A
)和结尾($
,\z
)的空白位置仍与两个正则表达式版本都匹配。
实际上,这是基准测试的结果:
require 'benchmark'
Benchmark.bmbm do |x|
x.report { 500000.times { a = 'foobar'[/(\Afoo)bar/] } }
x.report { 500000.times { a = 'foobar'[/\A(foo)bar/] } }
end
是
Rehearsal ------------------------------------
0.630000 0.000000 0.630000 ( 0.628344)
0.620000 0.000000 0.620000 ( 0.628949)
--------------------------- total: 1.250000sec
user system total real
0.640000 0.000000 0.640000 ( 0.635875)
0.630000 0.000000 0.630000 ( 0.627771)
说将锚点移出捕获组会使匹配快一点。但是,使用较小的时间值,结果会有所不同。我认为区别确实是疏忽大意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句