【问题标题】:Get substring from some char inside string从字符串中的某个字符获取子字符串
【发布时间】:2016-08-17 17:44:28
【问题描述】:

我正在尝试从下面的字符串中获取子字符串,即地址

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

是否有任何子字符串选项可以仅获取诸如“tfd”之类的地址详细信息

我正在尝试拆分,我认为这不是获得中间字符串的最佳选择。

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

【问题讨论】:

  • 总是“tfd”吗?它总是“地址:”之后的值吗?我们需要更多信息。
  • 只是检查:您的数据看起来很可疑,就像去掉了大括号、逗号和引号的 json 字符串。如果是这样:反序列化为一个对象,而不是摆弄字符串。
  • 这是一个字符串,而不是 json。我的动态字符串看起来像 json 但不是。

标签: c# string substring


【解决方案1】:

简单功能:

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:")

你会得到:

托马斯·诺兰·卡萨斯 5322 Otter LnMiddleberge FL 32068

【讨论】:

    【解决方案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;
    

    一些假设:

    • 地址总是一个字,即没有空格,
    • 模式将始终相同、相同的字段、相同的顺序、字段名称的大小写没有区别等。

    【讨论】:

    • 不确定假设地址中没有空格是否安全。
    • @juharr——这就是我把它放在“假设”中的原因。他可以接受也可以离开。
    【解决方案3】:
    var parts = test.split(' ');
    var keyIndex = parts.indexOf('address:');
    var address = parts[keyIndex + 1];
    

    【讨论】:

    • 适用于示例,但如果地址中有空格,例如“123 Maple Street”,则会失败。
    • @juharr -- 这就是为什么你必须执行一些规则。
    • 问题没有提到空格,示例没有空格。
    【解决方案4】:

    我个人更喜欢正则表达式解决方案,但我想添加一个非正则表达式:

    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 调用中的字符串以删除返回字符串两侧的空格。

    【讨论】:

    • 那么,如果地址本身是“details:”呢?
    • 那就不行了。看起来 OP 正在使用以 ':' 结尾的关键字来识别部分数据而不是数据本身,因此它应该是安全的。不过我不确定,所以如果需要,它只是 OP 的另一种选择。
    【解决方案5】:

    按照建议使用一些适合您需要的正则表达式模式

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

    【讨论】:

      猜你喜欢
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2017-10-16
      • 2011-05-25
      相关资源
      最近更新 更多