簡體   English   中英

在C#中解析像Field1:val1,Field2:val2,Field3 = val3這樣的字符串

[英]Parse string like Field1:val1,Field2:val2,Field3=val3 in c#

我想用類似的模式解析c#中類的toString方法的字符串返回:

Field1:val1,Field2:val2,Field3:val3等

其中val1,val2或val3可以是日期時間或alphamuneric值。

請提出任何標准方法。

這就是我要做的:

String data = "Field1:val1,Field2:val2,Field3=val3";
//split data into array of string with format like "key:value" or "key=value"
String[] keyValues = data.Split(',');
//for each string get the value and the key
foreach (var keyValue in keyValues)
{
    var pair = keyValue.Split(':', '=');
    var key = pair[0];
    var value = pair[1];
    var parsedValue = ParseValue(value);
}

private object ParseValue(string value)
{
    //Parsing string to various type of object is another problem to face
}

嘗試使用Split ,例如

String data = "Field1:val1,Field2:val2,Field3=val3";

// items is the array of {"Field1", "val1", "Field2", "val2"...}
String[] items = data.Split(',', ':', '=');  // <- Put all separators here

然后根據需要解析值:

  for (int i = 0; i < items.Length; ++i) {
    if (i % 2 == 0) { // <- Field Name
      String field = items[i];
      ...
    }
    else { // <- Value
      DateTime value = DateTime.Parse(items[i]); // <- Some kind of parsing; see also ParseExact, TryParse
      ...
    }
  }

盡管您可以手動拆分字符串並解析值,但是使用正則表達式一次提取所有對的速度要快得多。 在這種特殊情況下,它也不太復雜。

模式(?<key>\\w*)[:=](?<value>\\w*),? 將直接從輸入字符串中提取鍵/值對拆分為名為keyvalue組,例如:

var searchInput = "Field1:val1,Field2:val2,Field3=val3";
var regex = new Regex(@"(?<key>\w*)[:=](?<value>\w*),?");
var matches = regex.Matches(searchInput);
foreach (Match match in matches)
{
    var key = match.Groups["key"].Value;
    var val= match.Groups["value"].Value;
    Console.WriteLine("Key: {0} Value: {1}",key,val);
}

若要解析值,可以使用DateTime.TryParse將值轉換為日期時間。 如果失敗,則可以將其視為字符串,例如:

DateTime parsedDate;
object parsedValue;
if (DateTime.TryParse(val, out parsedDate) )
    parsedValue=parsedDate;
else 
    parsedValue=val;

在這種情況下,您必須修改原始正則表達式以在value模式中包括日期分隔符:

(?<key>\w*)[:=](?<value>[\w-:]*),?

如果錯誤添加了=分隔符,則可以將其從模式中刪除:

(?<key>\w*)[:](?<value>[\w-:]*),?

可以使用LINQ和匿名類型將其全部清理干凈,只獲取鍵/值對:

public static object DateOrString(string input)
{
    if (String.IsNullOrWhiteSpace(input))
        return input;
    DateTime parsedDate;
    if (DateTime.TryParse(input, out parsedDate))
        return parsedDate;
    return input;
}

...

var searchInput = "Field1:val1,Field2:val2,Field3:val3,Field4:2013-12-11T01:00:00";
var regex = new Regex(@"(?<key>\w*)[:=](?<value>[\w-:]*),?");
var matches = regex.Matches(searchInput);

var pairs = from Match match in matches
    select new {
        Key = match.Groups["key"].Value, 
        Value = DateOrString(match.Groups["value"].Value)
    };

現在可以將這些對轉換為字典,列表或任何其他合適的結構。

打印最后一個示例中的對將產生以下結果:

Key: Field1 Value: val1
Key: Field2 Value: val2
Key: Field3 Value: val3
Key: Field4 Value: 11/12/2013 1:00:00 am

代碼的.NET小提琴這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM