[英]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.