2

TNS名ファイルを解析する正規表現があります。ただし、特定のTNSNamesファイルでハングします。問題は、一致する文字列のパーツの後にスペースがあるかどうかまで追跡されてHOST=います。パターンの適切性を無視し、問題を修正する方法(これは対処されています)私が知りたいのは、Regex.Match(invalid)呼び出しが返されないため、入力の変更によってアプリケーションがハングする理由です

string valid = "SOMENAME = (DESCRIPTION= " + 
                "(ADDRESS= (PROTOCOL=TCP) (HOST = localhost) (PORT=1521) ) " + 
                "(CONNECT_DATA= (SERVICE_NAME=ABC)))";

string invalid = "SOMENAME = (DESCRIPTION= " + 
                "(ADDRESS= (PROTOCOL=TCP) (HOST =localhost) (PORT=1521) ) " + 
                "(CONNECT_DATA= (SERVICE_NAME=ABC)))";
Regex regex = new Regex("SOMENAME" + @"[^=]*=(\s|[^H]*)*HOST\s*=\s(?<host>[^\)]*)\s*\)", RegexOptions.Multiline | RegexOptions.IgnoreCase);
//this line is fine
Match match = regex.Match(valid);  
//this line causes visual studio to hang
match = regex.Match(invalid);
4

1 に答える 1

4

これは間違いなく壊滅的なバックトラックによって引き起こされ、原因は

(\s|[^H]*)*

とは同じコンテンツに一致する可能性が\sあり[^H]、2つの無限の量指定子をネストしているためです。

[^H]*単独ではまったく同じコンテンツに一致し、バックトラックする傾向がないため、次のことを試してください。

Regex regex = new Regex("SOMENAME" + @"[^=]*=([^H]*)HOST\s*=\s(?<host>[^\)]*)\s*\)", RegexOptions.Multiline | RegexOptions.IgnoreCase);
于 2012-05-01T08:38:36.817 に答える