2013-05-21 82 views
3

鑑於串ab關於正則表達式performancing

給出這個表達式模式

(a)(b) 

如果我們需要去除滿弦,但打印第二組,我們可以寫2株:

1)preg_replace("#(a)(b)#", "$2", "ab") // save both group

也是如此:

2)preg_replace("#(?:a)(b)#", "$1", "ab") // dont save first group

什麼變體更適合性能?

+0

嗨,我已經刪除了第二個問題。你仍然可以在另一個帖子中提問。你應該只問每個帖子1個問題。 – sashoalm

+0

@sashoalm好的,謝謝,理解。 – RIKI

+0

也是這是一個PHP的問題?我會重播它。 – sashoalm

回答

0

我跑每個操作在一個緊密循環5,000,000每個和比較時間。其實,我比較了四種操作:

preg_replace("#(a)(b)#", "$2", "ab"); 
preg_replace("#(?:a)(b)#", "$2", "ab"); 
preg_replace("#a(b)#", "$2", "ab"); 
preg_replace("#a(?=b)#", "", "ab"); 

我沒有看到時代一個非常一致的區別,所以我認爲它實際上沒有多大的性能,也就是我會選擇從哪個是最有意義一個設計/語義視角。

#1和#2的表現大致相同。 #2看起來稍微快一些,但偶爾會更慢(可能是由於服務器噪音)。 #3的速度一直比它快大約5%,而選項#4比#3快了大約2%(即它似乎是最好的,可能是因爲它不需要捕獲或插入任何東西)。

儘管如此,我還是會選擇最有意義的。

我意識到str_replace("ab", "b", "ab");可能不是類似的,但如果可以的話,使用它。它的速度比任何其他速度快兩倍。

+0

在#2例子中,您的意思是'$ 1'而不是'$ 2',對吧? – RIKI

+0

@OTARIKI yes;我重新測試了幾次,似乎沒有太大區別。 –

+0

哦,我的英語...... :)我的意思是,你在#2的例子中,'替換'有'$ 2',但你的意思是這裏'$ 1',對吧? :)非常感謝答覆 – RIKI

0

什麼變體更適合性能?

要麼。

如果你只需要做很少的替換,那根本就沒有關係。 如果您必須進行數百萬次替換,則必須考慮源數據的另一種格式,這將需要較少的解析。

但無論如何,現在的電腦都很快。我的意思是FAST。
足夠快以運行基於JSON或基於XML的應用程序,而JSON或XML解析需要比簡單的正則表達式WAY更多的資源。他們運行良好。所以,我懷疑你會面臨這樣一個條件,這樣的正則表達式會影響任何東西