【问题标题】:Using Regex to match commands and extract parameters使用正则表达式匹配命令并提取参数
【发布时间】:2014-07-16 05:46:45
【问题描述】:

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

【问题讨论】:

  • 缺乏定义的分隔将使这非常难以维护和扩展。这是一个解析问题,您可以将命令保存在列表中,但是参数,那么,您怎么可能知道 SENDDR456 表示 SENDDR(456) 而不是 SENDDR(4, 56) 或 SENDDR(45, 6)?你明白了,这是一个糟糕的协议。
  • 嘿,有任何答案有帮助吗,还是您仍然有问题?如果是这样,请提供更多详细信息。 :)
  • 我发现 CaptureCollection 可能是最好的答案。我会参与其中并发布任何见解。

标签: c# regex parsing


【解决方案1】:

.NET CaptureCollection 可以标记

但这取决于连续的参数是否可以很好地分隔或指定

对于您的示例,您可以使用此正则表达式:

(SENDDR|GET)(\d+|[a-z]+)+

这依赖于 .NET 正则表达式特有的出色 CaptureCollection,当量化给定的捕获组时,所有中间捕获都保存在堆栈中并可访问。

  • Groups[1].Value 包含命令
  • 捕获组 2 包含捕获集合中的参数:Groups[2].Captures[0].Value 包含第一个参数,Groups[1].Captures[1].Value 包含第二个参数

但请注意,这依赖于参数是否明确指定或分隔。例如,在本例中,一个参数由[a-z]+ 指定,另一个由\d+ 指定,它们是互斥的。

【讨论】:

  • 如果您对参数规范或分隔符有任何想法,请告诉我,以便我们微调正则表达式。 :)
【解决方案2】:

假设你的命令是大写,参数是小写或数字,你可以使用(\\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

【讨论】:

    【解决方案3】:

    如果信息位于不同样式、长度或偏移量的字符串中,Regex 无疑是最佳解决方案。

    这里只有两个命令,SENDDR 和 GET,可以通过子字符串函数检查,但是参数的长度每次都不相同,所以你必须通过数字和字母来检查。在这种情况下,Regex 很容易而不是实现这一切。

    这是假设参数是数字或小写字母的正则表达式

           (SENDDR|GET)(\d+|[a-z]+)+
    

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2016-07-14
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      相关资源
      最近更新 更多