Jos*_*shy 12 c# regex performance
过去一周我一直在用正则表达式做一些工作并且取得了很大的进步,但是,我仍然相当n00b.我有一个用C#编写的正则表达式:
string isMethodRegex =
@"\b(public|private|internal|protected)?\s*(static|virtual|abstract)?"+
@"\s*(?<returnType>[a-zA-Z\<\>_1-9]*)\s(?<method>[a-zA-Z\<\>_1-9]+)\s*\"+
@"((?<parameters>(([a-zA-Z\[\]\<\>_1-9]*\s*[a-zA-Z_1-9]*\s*)[,]?\s*)+)\)";
IsMethodRegex = new Regex(isMethodRegex);
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当调用正则表达式IsMethodRegex.IsMatch()时,它会在以下字符串上挂起30秒以上:
"\t * Returns collection of active STOP transactions (transaction type 30) "
Run Code Online (Sandbox Code Playgroud)
有没有人如何使用正则表达式的内部工作以及为什么在匹配此字符串而不是其他字符串时这将是如此之慢.我玩过它,发现如果我取出*和括号,那么它运行正常.也许正则表达式写得不好?
任何帮助都会非常感激.
编辑:我认为性能问题在于<parameters>匹配组的完成方式。我已重新排列以匹配第一个参数,然后匹配任意数量的连续参数,或者可选地根本不匹配。另外,我已将\s*参数类型和名称之间的参数更改为\s+(我认为这导致了很多回溯,因为它不允许空格,因此object可以匹配 asobj和ectwith\s*匹配无空格)并且它似乎运行得更快:
string isMethodRegex =
@"\b(public|private|internal|protected)?\s*(static|virtual|abstract)?"+
@"\s*(?<returnType>[a-zA-Z\<\>_1-9]*)\s*(?<method>[a-zA-Z\<\>_1-9]+)\s*\"+
@"((?<parameters>((\s*[a-zA-Z\[\]\<\>_1-9]*\s+[a-zA-Z_1-9]*\s*)"+
@"(\s*,\s*[a-zA-Z\[\]\<\>_1-9]*\s+[a-zA-Z_1-9]*\s*)*\s*))?\)";
Run Code Online (Sandbox Code Playgroud)
编辑:正如@Dan 所指出的,以下仅仅是因为正则表达式可以提前退出。
这确实是一个非常奇怪的情况,但是如果我在开始时删除两个可选匹配(对于公共/私有/内部/受保护和静态/虚拟/抽象),那么它几乎立即再次开始运行:
string isMethodRegex =
@"\b(public|private|internal|protected)\s*(static|virtual|abstract)"+
@"(?<returnType>[a-zA-Z\<\>_1-9]*)\s(?<method>[a-zA-Z\<\>_1-9]+)\s*\"+
@"((?<parameters>(([a-zA-Z\[\]\<\>_1-9]*\s*[a-zA-Z_1-9]*\s*)[,]?\s*)+)\)";
var IsMethodRegex = new Regex(isMethodRegex);
string s = "\t * Returns collection of active STOP transactions (transaction type 30) ";
Console.WriteLine(IsMethodRegex.IsMatch(s));
Run Code Online (Sandbox Code Playgroud)
从技术上讲,您可以将每种可能性分成四个单独的正则表达式来处理这种特定情况。但是,当您尝试处理越来越复杂的场景时,您可能会一次又一次遇到此性能问题,因此这可能不是理想的方法。
| 归档时间: |
|
| 查看次数: |
348 次 |
| 最近记录: |