【问题标题】:C# - Finding a string between two stringsC# - 在两个字符串之间查找一个字符串
【发布时间】:2020-06-03 16:02:10
【问题描述】:

我有一个string,看起来像这样:Value->Value2->Value3->ImportantValue->val

我想提取ImportantValue。我已经阅读了有关此问题的其他帖子,但它们都不适合我。我试过这个:

int pFrom = path.IndexOf("->") + "->".Length;
int pTo = path.LastIndexOf("->val");
String result = path.Substring(pFrom, pTo - pFrom);

它返回Value2->Value3->ImportantValue->val,因为它给出了第一个->->val 之间的字符串。关于如何更改上述代码以使其返回ImportantValue 的任何想法?提前致谢。

编辑

抱歉,我忘了指明ImportantValue 总是不同的。整个字符串也发生了变化,这意味着它将有更多的三个Values。但ImportantValue 始终是倒数第二个元素,因此我会将 Paul Kertscher 的答案标记为正确的答案,并为其他类似的答案投票。

【问题讨论】:

  • “ImportantValue”是否具有您正在寻找的某种特定格式或模式?也许它总是相同的值?
  • 总是第三个吗?
  • 你能给我们一个现实的字符串吗?识别重要值可能比使用“->”标记更容易

标签: c# string substring indexof


【解决方案1】:

假设字符串始终具有相同的格式,您可以只使用 Split 方法,并从 Split 返回的数组的最后一个元素中获取前一个。

var values = path.Split(new []{"->"}, StringSplitOptions.None);
var importantValue = values[values.Length-2];

请查看.NET Fiddle

【讨论】:

    【解决方案2】:

    如果ImportantValue 始终是倒数第二个元素,您可以执行以下操作

    var stringParts = path.Split(new[]{ "->" }, StringSplitOptions.None);
    if(stringParts.Length >= 2)
    {
        var importantValue = stringParts[stringParts.Length - 2];
    }
    else
    {
        throw new ArgumentException("Input did not match the expected value");
    }
    

    你也可以使用IEnumerable扩展

    var importantValue = path.Split(new[]{ "->" }, StringSplitOptions.None)
                             .Reverse() // reverse the enumerable
                             .Skip(1)   // discard "val"
                             .First();  // return the "ImportantValue"
    

    【讨论】:

      【解决方案3】:

      您可以为此使用Split 方法并从最后访问第二个项目

      var str = "Value->Value2->Value3->ImportantValue->val";
      var items = str.Split(new []{"->"}, StringSplitOptions.None);
      var importantValue = items[items.Length - 2];
      

      C#8 引入了一种新的索引方法,因此您也可以使用 var importantValue = items[^2]; 语法

      您还可以检查结果数组的长度,它至少有两个元素

      【讨论】:

      • 这与@Christos 的答案相同
      【解决方案4】:

      我相信您可以使用带有 ">" 的 string.split 作为您的 char 数组并获取该数组。获得数组后,您应该能够迭代数组并获得所需的值

      【讨论】:

        【解决方案5】:

        当重要的值是来自end2nd时,LastIndexOf而不是IndexOf是一个很自然的选择;请注意,由于我们从末尾开始搜索,因此我们首先计算的是pTo

          string path = "Value->Value2->Value3->ImportantValue->val";
        
          string delimiter = "->";
        
          int pTo   = path.LastIndexOf(delimiter);
          int pFrom = pTo >= 0 ? path.LastIndexOf(delimiter, pTo) + delimiter.Length : -1;
        
          // Either important value or null
          string result = pFrom >= 0 
            ? path.Substring(pFrom, pTo - pFrom) 
            : null; // or throw exception here
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-13
          • 2014-12-07
          • 1970-01-01
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          • 2011-11-20
          相关资源
          最近更新 更多