使用Regex匹配命令和提取参数
本文关键字:提取 参数 命令 Regex 使用 | 更新日期: 2023-09-27 18:13:12
我正在寻找一种简单的方法(对于将输入有关命令和参数的所有信息的人)从命令列表中匹配命令并从中提取特定参数。例如这两个命令:SENDDR456(其中456是参数)GETmsg35(其中msg和35是两个参数)我认为正则表达式是最好的选择。我们的目标是使标识符'提取器可伸缩,并允许轻松地添加更多命令。我正在使用c#。
。NET capturecall可以标记
但这取决于连续参数是否可以良好分隔或良好指定
对于您的示例,您可以使用以下正则表达式:
(SENDDR|GET)('d+|[a-z]+)+
这依赖于。net regex特有的了不起的CaptureCollection,当给定的捕获组被量化时,所有中间捕获都保存在堆栈中并可访问。
-
Groups[1].Value
包含命令 - 捕获组2包含捕获集合中的参数:
Groups[2].Captures[0].Value
包含第一个参数,Groups[1].Captures[1].Value
包含第二个参数
但请注意,这依赖于参数被很好地指定或分隔。例如,在本例中,一个参数由[a-z]+
指定,另一个参数由'd+
指定,它们是互斥的。
假设您的命令是大写,参数是小写或数字,您可以使用(''d+)|([a-z]+)
var matches1 = Regex.Matches("GETmsg35", "(''d+)|([a-z]+)");
foreach(Match match in matches1)
Console.WriteLine(match.Value);
包含命令可以使用([A-Z]+)|([a-z]+)|(''d+)
var matches1 = Regex.Matches("GETmsg35", "([A-Z]+)|([a-z]+)|(''d+)");
if(matches1.Count > 0)
Console.WriteLine("Command >> " + matches1[0].Value);
for(int i=1; i < matches1.Count; i++)
Console.WriteLine("Parameters >> " + i + "'t" + matches1[i].Value);
Command >> GET
Parameters >> 1 msg
Parameters >> 2 35
如果信息存在于不同样式、长度或偏移量的字符串中,Regex无疑是最佳解决方案。
这里只有两个命令,SENDDR和GET,可以通过子字符串函数检查,但是参数的长度每次都不一样,所以你必须通过数字和字母来检查它。在这种情况下,Regex比实现所有这些更容易。
下面是假设参数是数字或小写字母的正则表达式
(SENDDR|GET)('d+|[a-z]+)+