C# - 在两个字符串之间查找字符串

C# - Finding a string between two strings

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

我想提取ImportantValue。我已阅读有关此问题的其他帖子,但其中 none 对我有用。我试过这个:

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

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

编辑

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

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

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

请检查.NET Fiddle

如果 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"

您可以为此使用 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]; 语法

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

我相信您可以使用 string.split 和“>”作为您的字符数组并获取该数组。获得数组后,您应该能够迭代数组并获得所需的值

当重要的值是结束2nd时,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