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 を使用することは非常に危険である可能性があることを示しているようです。
何か不足していますか?正規表現の一致で無限ループを防ぐ方法はありますか?