2016-08-17 40 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; }