有一个简单的任务来获取 XPath 表达式并返回与(可能)选择的节点的父节点匹配的前缀。
例子:
/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
因为模式相当规则,所以我查找了 '/' 后跟标识符,后跟一个匹配字符串末尾的可选组 (....)?$
代码似乎可以工作,但是使用不同的输入字符串值,我发现通过简单地插入一个空格(在注释中显示的位置),.NET IsMatch 函数进入一个无限循环,占用它获得的所有 CPU .
现在,不管这个正则表达式模式是否是最好的模式(我有更复杂但简化它以显示问题),这似乎表明使用 RegEx 与任何不平凡的事情可能是非常冒险的。
我错过了什么吗?有没有办法防止正则表达式匹配中的无限循环?