我有这样的正则表达式:
“错误1 |错误2 |错误3 |错误4 |错误5” 大约80(可能更多)错误的错误消息
现在我检查我的文本中是否存在错误消息:
Regex errorRegex = new Regex("error 1|error 2|error 3|error 4|error 5");
if (errorRegex.Match(content).Success)
return "ERROR";
但现在我需要返回哪些消息在内容中,例如“错误4”我可以在一场比赛中执行此操作吗?这样做的最佳方法(针对性能进行了优化)是什么?
答案 0 :(得分:1)
通过保留Match
类型的临时变量来尝试此操作:
Regex errorRegex = new Regex("error 1|error 2|error 3|error 4|error 5");
Match match = errorRegex.Match(content);
if (match.Success)
return match.Value;
答案 1 :(得分:1)
首先,如果存在标准错误消息输出,则可以大大简化正则表达式语句:
Regex errorRegex = new Regex("error ([0-5]{1-2}).*");
您的错误消息应如下所示,例如“错误42:blah blah”。
然后,错误消息很容易解析其编号。
然后只有错误编号的案例条件。
大括号内的值将在组1中,并且是0到5之间的数字。 检查匹配项,如果找到匹配项,则提取组:
MatchCollection MatchList = errorRegex.Matches(content);
Match firstMatch = MatchList[0];
int errNum;
if(firstMatch && firstMatch.Groups[0] && firstMatch.Groups[1]){
errNum = (int)firstMatch.Groups[1];
}
否则,如果您正在解析其他人的错误消息,那么只需返回您从函数中找到的消息,并编写一个switch语句来处理每个错误代码,如下所示:
void ErrorFunction(string content){
[...]
Regex errorRegex = new Regex("error 1|error 2|error 3|error 4|error 5");
Match rMatch = errorRegex.Match(content);
if (rMatch.Success)
return rMatch.Value;
}
然后在其他地方:
switch(ErrorFunction(content)){
case "error 1":
DoSomething();
break;
case "error 2":
DoSomething();
break;
case "error 3":
case "error 4":
case "error 5":
DoSomething();
break;
default:
DoSomething();
break;
}
答案 2 :(得分:0)
为什么不首先检查是否存在error 4
,然后返回?
听起来你正试图过早地优化你的代码。你有没有想过它?
如果有的话,将更复杂的检查放入正则表达式会使事情变得更加缓慢。保持代码和逻辑简单,然后运行分析。