2011-02-04 278 views
1

我想知道爲什麼彙編這樣的正則表達式佔用了我的RAM的70%,導致激烈的交換和平均負載16:

strcpy(regexStr,"^[a-z]{0,20000}$"); 
regcomp(&regex , regexStr , REG_NOSUB | REG_EXTENDED); 

執行時間大約爲幾分鐘(必須先殺死進程)。 ^[a-z]{0,2000}$(2,000,不是20,000)的執行時間大約是100ms,這對我來說非常重要。

我用它來檢查一個模式,同時檢查長度。我發現正則表達式對於兩者都很方便。難道我做錯了什麼 ?

+2

您正在使用哪種正則表達式引擎? – marcog 2011-02-04 16:02:43

+0

@marco:就語言而言,我只能猜測C或C++(`strcpy`,`regcomp`) – 2011-02-04 16:06:47

+0

@Matt這很明顯,但有很多C++正則表達式引擎。 – marcog 2011-02-04 16:09:23

回答

10

我建議使用strlen來測量字符串長度,然後用正則表達式/[^a-z]/來測試是否存在非alpha字符。吻。

順便說一句,不,我沒有看到任何好的理由*爲什麼你會得到這樣的表現。

*很好的理由顯然不包括錯誤或設計不當...

編輯:原來,它實際上可能是poor design

EDIT2的情況:因爲你正在做的檢查很簡單,你實際上可以實現在普通的C:

int i; 
for (i=0; i<20000 && str[i]!=0; i++) 
    if (str[i] < 'a' || str[i] > 'z') 
    return -1; 
return i; 

如果它返回-1,該字符串包含範圍之外的字符az;如果它返回20000字符串超過20000個字符;否則它返回字符串長度。 (注意:這隻會對非寬字符串有效)

+1

隨着491代表,你應該能夠編輯你的實際答案,而不是在它下面評論。如果沒有,這裏有一個拇指讓你更接近你需要的任何代表。 – KeithS 2011-02-04 16:09:16

0

你必須考慮你要求編譯器做什麼。以一種天真的方式,你可以認爲正則表達式編譯是構建一個只接受匹配正則表達式的字符串的有限狀態機器。考慮一臺機器的狀態大小,它必須跟蹤字符串中有多少個字符,並且您應該看到當前正則表達式的問題。

1

我的猜測是基數範圍是什麼殺了你。嘗試使用貪婪的非特定基數匹配,例如"^[a-z]*$",加上最大長度檢查。它應該快得多。

4

賠率是在引擎蓋下你的正則表達式引擎正在將你的模式轉換爲^(|[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|..)$這是你的範圍的基數的二次方。

相關問題