2016-04-21 50 views
0

當在正則表達式中捕捉的模式與錨點相鄰時,包括捕捉中的錨點或不會影響捕獲的字符串。在以下(Ruby)正則表達式對中,在正則表達式捕獲中包含錨是否更好?

/(\Afoo)bar/ 
/\A(foo)bar/ 

/foo(bar\z)/ 
/foo(bar)\z/ 

/foo(^bar)baz/ 
/foo^(bar)baz/ 

/foo(bar$)baz/ 
/foo(bar)$baz/ 

結果是一樣的。從表現來看,將錨點包含在捕捉中是否更好,還是不會造成差異?

+3

應該沒有區別,因爲錨點是零寬度斷言。對於空洞空間進入什麼羣體沒有什麼不同,對於性能,這兩個錨點在兩種情況下都以消耗模式使用 - 這應該會導致相同的生產力。 –

回答

0

從實用的角度出發,需要提供對是相同的的要點是,錨定件是匹配空字符串該零寬度斷言:/(\Afoo)bar//\A(foo)bar/將在字符串的開頭相匹配foobar同時存儲foo在1組等

從邏輯上來看,應該有在生產率作爲空位置在開始時(^\A)和結束行的無差異($\z)/字符串仍然與兩個正則表達式版本匹配。

在實踐中,這是benchmarking結果:

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) 

話說移動錨出了捕獲組的匹配使得一點點更快。 但是,具有較小的時間值,results vary。我認爲這種差別真的是疏忽大意。

相關問題