2013-12-11 29 views
-1

我想分析從一個類的toString方法在C#的字符串返回與圖案像:解析字符串等字段1:VAL1,字段2:在c#val2的,字段3 = VAL3

字段1:VAL1,字段2:val2的,Field3:val3等

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

請建議任何標準的方法來做到這一點。

+1

.NET Fiddle(http://msdn.microsoft.com/en -us/library/system.string.split(v = vs.110).aspx)和[DateTime.TryParse](http://msdn.microsoft.com/en-us/library/ch92fbc1(v = vs.110 )的.aspx)。 –

+1

所以分隔符可以是':'和'='? –

+0

你可以通過分割字符串,這會給你的鍵值對類結果。進一步分離:會給你你需要的東西 –

回答

1

嘗試使用拆分,例如,

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 
     ... 
    } 
    } 
3

這是我會做什麼:

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 
} 
1

雖然可以手動分割字符串,並解析值,這是遠遠快使用regular expression一次提取所有對。在這種特殊情況下,它也不那麼複雜。

模式(?<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 

A於[String.Split]讀取了代碼is here

+0

正則表達式只用key = Field1和value = val1來獲取鍵/值,而不是包含所有字段和值的組。 – user3081925

+0

對於什麼輸入?例如,我得到4對,最後一對有日期值。添加了示例的[.net小提琴](http://dotnetfiddle.net/uhutqw) –

相關問題