2015-10-16 34 views
1

我有很多文件少於64 kb,我需要將它們轉換爲下面的代碼。正則表達式工作很慢

這是QT中的工作代碼QRegExp

我試圖用regex_replace在MSVC中重寫它,並且面臨着非常慢的工作問題。

QT:

temp.replace(QRegExp("[ ]{0,}(=)[ ]{0,}"), QString("=")); 
temp.replace(QRegExp("[ ]{0,}(==)[ ]{0,}"), QString("==")); 
temp.replace(QRegExp("[ ]{0,}(>)[ ]{0,}"), QString(">")); 
temp.replace(QRegExp("[ ]{0,}(<)[ ]{0,}"), QString("<")); 
temp.replace(QRegExp("[ ]{0,}(\\&\\&)[ ]{0,}"), QString("&&")); 
temp.replace(QRegExp("[ ]{0,}(\\|\\|)[ ]{0,}"), QString("||")); 
temp.replace(QRegExp("[ ]{0,}(\\})[ ]{0,}"), QString("}")); 
temp.replace(QRegExp("[ ]{0,}(\\{)[ ]{0,}"), QString("{")); 

MSVC:

temp = regex_replace(temp, std::regex("[ ]{0,}(=)[ ]{0,}"), "="); 
temp = regex_replace(temp, std::regex("[ ]{0,}(==)[ ]{0,}"), "=="); 
temp = regex_replace(temp, std::regex("[ ]{0,}(>)[ ]{0,}"), ">"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(<)[ ]{0,}"),"<"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\&\\&)[ ]{0,}"),"&&"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\|\\|)[ ]{0,}"),"||"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\})[ ]{0,}"), "}"); 
temp = regex_replace(temp, std::regex("[ ]{0,}(\\{)[ ]{0,}"),"{"); 

例如:std::string溫度(18KB的大小〜),用於對每個線約10秒的處理。

這裏可能有什麼問題?

+0

哪個是使用'Qt'代替的?我的意思是,其中一個比另一個好得多?從你寫的內容不清楚。 – skypjack

+0

您是否嘗試過使用簡單的正則表達式來檢查正則表達式自動機是否消耗了時間,或者通過讀取某些不幸的時尚文件? – mvw

+0

@skypjack我不能告訴QT的確切執行時間,但它非常快,我不必去想它。 –

回答

4

std::regex可用的實現不是真的要搶奪(但?),但boost::regex是相當快。

+0

看起來boost庫對每個問題的解決方案都比std更快更優雅。 –

+0

那麼''boost :: regex''是第一個。但是我想知道爲什麼clang/libC++的人沒有將'std :: regex'放在'boost :: regex''上。它性能更好,並且擁有許可許可。這意味着沒有任何理由表現更差。 – kamikaze