我解析形式的(種)名稱:正則表達式進入無限循環
Parus Ater
H. sapiens
T. rex
Tyr. rex
通常具有兩個術語(二項式),但有時有3個或更多。
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
我寫
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
其工作的大部分時間,但偶爾走進一個無限循環。它花了一些時間來追查,這是在正則表達式匹配,然後我意識到這是一個錯字,我應該寫
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
執行正常。
我的問題是:
- 爲什麼會發生這種循環發生的呢?
- 有沒有辦法在運行程序之前檢查類似的正則表達式錯誤?否則,可能難以在發佈prgram之前將其陷入困境並導致問題。
[注意:我不需要一個更一般的表達式 - 對於物種名稱有一個正式的100+行正則表達式規範 - 這只是一個初始過濾器]。
注意:問題出現了,因爲雖然大多數名字被精確地提取到2或偶爾3/4的術語(如它們在斜體中),但有一些誤報(如"Homo sapiens lives in big cities like London"
),並且匹配在「L」處失敗。 ]
注意:在調試中,我發現正則表達式經常完成,但速度很慢(例如,在較短的目標字符串上)。我通過一個病理案例發現了這個錯誤是很有價值的。我學到了重要的一課!
你不能簡單地預測,如果一個正則表達式將進入一個無限循環。如果你有太多複雜的正則表達式(「100+行正則表達式」),它可能是(我說「可能」),您需要某種形式的解析器代替。 – 2013-04-10 07:08:16
,我認爲你應該寫'(\ S + [AZ] +)+',而不是'\ S + [AZ] [AZ] +(\ S + [AZ] +)*' – shift66 2013-04-10 07:08:34
@ shift66我寫的'\ S + [AZ] [az] +'因爲我想確保第二項至少有2個字符。我不在乎第三個和後來。 – 2013-04-10 07:10:40