我正在寻找一种简单的方法(对于将输入有关命令和参数的所有信息的人)来匹配命令列表中的命令并从中提取特定参数。 例如,这两个命令: SENDDR456(其中456是参数) GETmsg35(其中msg和35是两个参数) 我认为正则表达式是最好的选择。 目标再次是使标识符\ extractor可扩展,并允许轻松添加更多命令。 我正在使用C#。
答案 0 :(得分:1)
但这取决于连续参数是否可以很好地划分或明确指定
对于您的示例,您可以使用此正则表达式:
(SENDDR|GET)(\d+|[a-z]+)+
这依赖于特定于.NET正则表达式的极好的CaptureCollection,当量化给定的捕获组时,所有中间捕获都保存在堆栈中并可访问。
Groups[1].Value
包含命令Groups[2].Captures[0].Value
包含第一个参数,Groups[1].Captures[1].Value
包含第二个参数但请注意,这取决于明确指定或分隔的参数。例如,在此示例中,一个参数由[a-z]+
指定,另一个参数由\d+
指定,它们是互斥的。
答案 1 :(得分:0)
假设您的命令是大写且参数是小写或数字,您可以使用(\\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
答案 2 :(得分:0)
如果信息位于具有不同样式,长度或偏移的字符串中,Regex肯定是最佳解决方案。
这里只有两个命令,SENDDR和GET可以通过子串函数检查,但每次参数的长度都不一样,所以你必须用数字和字母来检查它。在这种情况下,正则表达式很容易而不是实现这一切。
这是正则表达式,假设参数是数字或小写字母
(SENDDR|GET)(\d+|[a-z]+)+