繁体   English   中英

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

[英]Regex to find a string between two special known characters

我试图使用正则表达式解析通过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; }
    }
}

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

/\!\w*/g

要匹配组中的键/值对,可以尝试如下操作:

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

上述正则表达式的示例可以在此处找到。

您无需在这里使用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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM