獲得一個簡單的任務來獲取XPath表達式並返回一個匹配(可能)所選節點的父節點的前綴。如何避免.NET RegEx類中的無限循環?
例子:
/aaa/bbb => /aaa
/aaa/bbb/ccc => /aaa/bbb
/aaa/bbb/ccc[@x='1' and @y="/aaa[name='z']"] => /aaa/bbb
由於方括號內的模式可能包含引號內支架,我決定嘗試用正則表達式來實現這一目標。這裏有一個代碼片段:
string input =
"/aaa/bbb/ccc[@x='1' and @y=\"/aaa[name='z'] \"]";
// ^-- remove space for no loop
string pattern = @"/[a-zA-Z0-9]+(\[([^]]*(]"")?)+])?$";
System.Text.RegularExpressions.Regex re =
new System.Text.RegularExpressions.Regex(pattern);
bool ismatch = re.IsMatch(input); // <== Infinite loop in here
// some code based on the match
因爲模式是比較有規律,我找了「/」後indentifier其次是在字符串的結尾(....)$
相匹配的可選的組?該代碼似乎工作,但爲輸入字符串使用不同的值,我發現只需插入一個空間(在註釋中顯示的位置),.NET IsMatch函數進入無限循環,將所有它獲得的CPU。
現在無論這個正則表達式模式是否是最好的(我有更復雜但簡化它來顯示問題),這似乎表明,使用正則表達式與任何不平凡的可能是非常危險的。
我錯過了什麼嗎?有沒有辦法防止正則表達式匹配中的無限循環?
一般來說,是不是等同於暫停問題? – 2009-07-29 14:29:31