【发布时间】:2010-11-15 02:22:28
【问题描述】:
有一个简单的任务来获取 XPath 表达式并返回与(可能)选择的节点的父节点匹配的前缀。
例子:
/aaa/bbb => /aaa
/aaa/bbb/ccc => /aaa/bbb
/aaa/bbb/ccc[@x='1' and @y="/aaa[name='z']"] => /aaa/bbb
因为方括号内的模式可能包含引号内的括号,所以我决定尝试使用正则表达式来实现这一点。这是一个代码sn-p:
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
因为模式相当规则,我寻找'/'后跟标识符,后跟一个匹配字符串末尾的可选组 (....)?$
该代码似乎可以工作,但使用不同的输入字符串值,我发现只需插入一个空格(在注释中显示的位置),.NET IsMatch 函数就会进入无限循环,将所有它得到的 CPU。
现在不管这个正则表达式模式是否是最好的(我有更复杂但简化了它以显示问题),这似乎表明使用正则表达式和任何不平凡的东西可能是非常危险的。
我错过了什么吗?有没有办法防止正则表达式匹配中的无限循环?
【问题讨论】:
-
一般来说,这不就相当于停机问题吗?
标签: .net regex infinite-loop