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
我有一个 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