C# 正则表达式来查找两个特殊已知字符之间的字符串

C# 正则表达式来查找两个特殊已知字符之间的字符串,c#,regex,C#,Regex,我正在尝试使用正则表达式解析通过TCP传输的消息,但没有成功 我的命令从开始!后跟命令名和参数列表,格式为或参数名=参数值,包含在 例如: !LOGIN?<USERNAME='user'><PASSWORD='password'>; 我的代码: public class CommandParser { private Dictionary<string, string> arguments = new Dictionary<string, st

我正在尝试使用正则表达式解析通过TCP传输的消息,但没有成功

我的命令从开始!后跟命令名和参数列表,格式为或参数名=参数值,包含在

例如:

!LOGIN?<USERNAME='user'><PASSWORD='password'>;
我的代码:

public class CommandParser
{
    private Dictionary<string, string> arguments = new Dictionary<string, string>();

    public CommandParser(string input)
    {
        Match commandMatch = Regex.Match(input, @"\!([^)]*)\&");

        if (commandMatch.Success)
        {
            CommandName = commandMatch.Groups[1].Value;
        }

        // Here we call Regex.Match.
        MatchCollection matches = Regex.Matches(input,"(?<!\\S)<([a-z0-9]+)=(\'[a-z0-9]+\')>(?!\\S)",
            RegexOptions.IgnoreCase);

        //
        foreach (Match argumentMatch in matches)
        {
            arguments.Add(
                argumentMatch.Groups[1].Value,
                argumentMatch.Groups[2].Value);
        }
    }

    public string CommandName { get; set; }

    public Dictionary<string, string> Arguments
    {
        get { return arguments; }
    }

    /// <summary>
    /// 
    /// </summary>
    public int ArgumentCount
    {
        get { return arguments.Count; }
    }
}

要查找命令名,请查找!应该足够了:

/\!\w*/g
要在组中匹配键/值对,可以尝试以下操作:

(\w+)='([a-zA-Z_]*)'
可以找到上述正则表达式的示例。

此处不需要正则表达式,除非这是最后一个选项,否则请避免使用它们。您可以使用简单的C逻辑实现这一点

string input = "!LOGIN?<USERNAME='user'><PASSWORD='password'>";
string command = input.Substring(1, input.IndexOf('?') - 1);
Console.WriteLine($"command: {command}");
var parameters = input
                    .Replace($"!{command}?", string.Empty)
                    .Replace("<", "")
                    .Split(">".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

string[] kvpair;
foreach(var kv in parameters) {
    kvpair = kv.Split('=');
    Console.WriteLine($"pname: {kvpair[0]}, pvalue: {kvpair[1]}");
}
command: LOGIN
pname: USERNAME, pvalue: 'user'
pname: PASSWORD, pvalue: 'password'