使用Regex匹配命令和提取参数

本文关键字:提取 参数 命令 Regex 使用 | 更新日期: 2023-09-27 18:13:12

我正在寻找一种简单的方法(对于将输入有关命令和参数的所有信息的人)从命令列表中匹配命令并从中提取特定参数。例如这两个命令:SENDDR456(其中456是参数)GETmsg35(其中msg和35是两个参数)我认为正则表达式是最好的选择。我们的目标是使标识符'提取器可伸缩,并允许轻松地添加更多命令。我正在使用c#。

使用Regex匹配命令和提取参数

。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]+)+