2017-06-04 71 views
1

我想解析使用正則表達式沒有成功我自己的網絡協議通過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; } 
    } 
} 

回答

1

要找到命令名字,查找「!」之後的第一個單詞應該足夠:

/\!\w*/g 

要在組匹配鍵/值對,你可以嘗試這樣的:

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

上述正則表達式的例子可以發現here

1

你不需要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' 
相關問題