gpt4 book ai didi

c# - C#中的正则表达式运行缓慢

转载 作者:可可西里 更新时间:2023-11-01 08:27:07 25 4
gpt4 key购买 nike

过去一周我一直在用正则表达式做一些工作并取得了很大的进步,但是,我仍然相当 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);

出于某种原因,当调用正则表达式 IsMethodRegex.IsMatch() 时,它会在以下字符串上挂起 30 多秒:

"\t * Returns collection of active STOP transactions (transaction type 30) "

谁知道 Regex 的内部结构是如何工作的,以及为什么匹配这个字符串而不是其他字符串会这么慢。我玩过它,发现如果我去掉 * 和括号,它就可以正常运行。可能是正则表达式写的不好?

如有任何帮助,我们将不胜感激。

最佳答案

编辑:我认为性能问题会阻碍<parameters>匹配组完成。我重新排列以匹配第一个参数,然后匹配任意数量的连续参数,或者可选地根本不匹配。我也改变了 \s*参数类型和名称之间为 \s+ (我认为这是造成大量回溯的原因,因为它不允许有空格,所以 object 可以匹配为 object\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*))?\)";

编辑:正如@Dan 所指出的那样,以下只是因为 Regex 可以提前退出。

这确实是一个非常奇怪的情况,但如果我删除开头的两个可选匹配(公共(public)/私有(private)/内部/ protected 和静态/虚拟/抽象)然后它几乎立即再次开始运行:

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));

从技术上讲,您可以将每种可能性分成四个独立的正则表达式来处理这种特定情况。然而,当您尝试处理越来越复杂的场景时,您可能会一次又一次地遇到这个性能问题,因此这可能不是理想的方法。

关于c# - C#中的正则表达式运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com