C#如何将AVAYA电话系统返回的错误字符串拆分为可读语句
AVAYA电话系统返回错误的解析方案
报文格式规律梳理
明确返回内容的固定结构是解析的核心依据:
- 首行是用户执行的操作命令,示例中为
cadd hunt-group 109(添加寻线组109的操作) - 所有有效错误条目均以
e+数字开头,每行对应一条独立错误 - 单条错误行的结构固定:
错误码 8位十六进制状态码 4位十六进制状态码 [可选的双引号包裹的分机号] 错误描述文本 - 末尾单独的
t是系统返回结束的标记,无实际业务含义
解析实现思路
不需要拆分所有单词,按固定格式匹配即可:
- 预处理:将原始返回按
\n拆分,过滤空行、首尾冗余引号、回车符,再剔除末尾的结束标记t - 提取首行作为执行的操作命令存储
- 遍历剩余错误行,用正则匹配固定结构的各个字段即可
C# 实现示例(匹配你此前的C#开发场景)
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; // 解析结果存储结构 public class AvayaCommandResult { /// <summary> /// 执行的AVAYA操作命令 /// </summary> public string ExecutedCommand { get; set; } /// <summary> /// 返回的错误列表 /// </summary> public List<AvayaErrorItem> Errors { get; set; } = new(); } public class AvayaErrorItem { /// <summary> /// 错误码 e2/e3等 /// </summary> public string ErrorCode { get; set; } /// <summary> /// 十六进制状态码1 /// </summary> public string HexStatusCode1 { get; set; } /// <summary> /// 十六进制状态码2 /// </summary> public string HexStatusCode2 { get; set; } /// <summary> /// 关联的分机号(可选) /// </summary> public string RelatedExtension { get; set; } /// <summary> /// 原始错误描述 /// </summary> public string ErrorMessage { get; set; } /// <summary> /// 错误描述中文 /// </summary> public string ErrorMessageCn => ErrorCode switch { "e3" => "分机号已被分配,请选择其他分机号", "e2" => "必须指定组分机号", _ => ErrorMessage }; } public static class AvayaErrorParser { // 预编译正则,分组依次匹配错误码、状态码1、状态码2、可选分机号、错误描述 private static readonly Regex _errorLineRegex = new Regex(@"^(e\d+)\s+([0-9a-fA-F]{8})\s+([0-9a-fA-F]{4})\s+(?:""([^""]+)""\s+)?(.*)$", RegexOptions.Compiled); public static AvayaCommandResult Parse(string rawResponse) { var result = new AvayaCommandResult(); if (string.IsNullOrWhiteSpace(rawResponse)) return result; // 拆分+清洗行数据 var allLines = rawResponse.Split('\n') .Select(l => l.Trim(' ', '"', '\r')) .Where(l => !string.IsNullOrWhiteSpace(l)) .ToList(); if (!allLines.Any()) return result; // 提取首行命令 result.ExecutedCommand = allLines[0]; // 处理错误行,跳过结束标记t var errorLines = allLines.Skip(1).Where(l => l != "t"); foreach (var line in errorLines) { var match = _errorLineRegex.Match(line); if (!match.Success) continue; result.Errors.Add(new AvayaErrorItem { ErrorCode = match.Groups[1].Value, HexStatusCode1 = match.Groups[2].Value, HexStatusCode2 = match.Groups[3].Value, RelatedExtension = match.Groups[4].Success ? match.Groups[4].Value.Trim() : null, ErrorMessage = match.Groups[5].Value.Trim() }); } return result; } }
解析效果示例
用你给出的原始报文测试,解析后结果为:
- 执行命令:
cadd hunt-group 109 - 错误列表:
- 错误码e3,关联分机号34257,错误描述:分机号已被分配,请选择其他分机号
- 错误码e2,无关联分机号,错误描述:必须指定组分机号
内容的提问来源于stack exchange,提问作者DaveM
相关产品推荐
相关产品推荐

