正则表达式在两个特殊的已知字符之间找到一个字符串

时间:2017-06-04 18:17:53

标签: c# regex

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

我的命令开头!其次是COMMAND_NAME以及格式中的参数列表或<>中包含的ARGUMENT_NAME = ARGUMENT_VALUE

例如:

!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; }
    }
}

2 个答案:

答案 0 :(得分:0)

要查找命令名称,请在“!”后找到第一个单词。应该够了:

/\!\w*/g

要匹配组中的键/值对,您可以尝试类似:

(\w+)='([a-zA-Z_]*)'

可以找到上述正则表达式的示例here

答案 1 :(得分:0)

这里你不需要regex并避免它们,除非这是最后一个选项。您可以使用简单的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'