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