2016-08-17 41 views
1

我想從下面的字符串得到一些字符串裏面串

string test = "name: abc loc: xyz address: tfd details: ddd"; 

串即地址是否有子選項來獲得唯一地址的詳細信息,如「TFD」

我想通過分裂,我認爲這不是獲得中間字符串的最佳選擇。

test.Text.Split(':').LastOrDefault() 
+3

[正則表達式](https://en.wikipedia.org/wiki/Regular_expression)FTW! –

+0

它總是「tfd」?它是否始終是「address:」之後的值?我們需要更多信息。 – krillgar

+0

只需檢查:您的數據看起來像一個json字符串,帶有花括號,逗號和引號。如果是這樣的話:去序列化一個對象,而不是用字符串擺弄。 – Filburt

回答

2

這裏有一個方法使用正則表達式:

var pattern = @"name: (\S+) loc: (\S+) address: (\S+) details: (\S+)"; 
var match = Regex.Match(input, pattern); 
var group = match.Groups[3]; 
var value = group.Value; 

一些假設:

  • 地址將永遠是一個詞,即沒有空格,
  • 格局將始終相同的字段,相同的順序,在字段名稱的情況下沒有區別等。
+0

不確定假設地址沒有空間是安全的。 – juharr

+0

@juharr - 這就是爲什麼我把它放在「假設」中。他可以拿走或離開它。 –

2
var parts = test.split(' '); 
var keyIndex = parts.indexOf('address:'); 
var address = parts[keyIndex + 1]; 
+0

適用於該示例,但如果地址中有空格,例如「123 Maple Street」,則失敗。 – juharr

+0

@juharr - 這就是爲什麼你必須執行一些規則。 –

+1

這個問題沒有提到空格,例子也沒有。 –

2

我個人比較喜歡的正則表達式解決方案的更多,但我想添加一個非正則表達式之一:

string test = "name: abc loc: xyz address: t f d details: ddd"; 
int start = test.IndexOf("address:"); 
int end = test.IndexOf("details:"); 
string adr = test.Substring(start, end-start); 
Console.WriteLine(adr); 

打印

t f d 

所以我知道這個版本的作品與空間。

編輯:

您可能需要運行adr.Trim()或修改字符串兩個IndexOf調用切出的空間上返回的字符串的兩側。

+0

那麼,如果地址本身是「細節:」呢? –

+0

然後它不起作用。它看起來像OP使用以':'結尾的關鍵字來標識部分數據而不是數據本身,所以它應該是安全的。我不知道這是肯定的,所以這只是OP的另一種選擇,如果需要的話。 – Cody

3

簡單的函數:

public static string GetTextbetween(string content, string start, string end) 
{ 
    if (content.Length == 0 || start.Length == 0 || end.Length == 0) 
     return string.Empty; 
    string contentRemove = content.Remove(0, content.IndexOf(start, StringComparison.Ordinal) + start.Length); 
    return contentRemove.Substring(0, contentRemove.IndexOf(end, StringComparison.Ordinal)).Trim(); 
} 

例子:

GetTextbetween("name: abc loc: xyz address: Thomas Nolan Kaszas 5322 Otter LnMiddleberge FL 32068 details: ddd", "address:", "details:") 

,你會得到:

托馬斯·諾蘭Kaszas 5322水獺LnMiddleberge FL 32068

2

我們e一些正則表達式適合您的需求

Match m = new Regex(@"address:\s(.*)\sdetails").Match(test); 
if (m.Groups.Count > 0) 
    { string s = m.Groups[1].Value; }