C# - Нахождение строки между двумя строками - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть 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 всегда является вторым по последнему элементу, поэтому я отмечу ответ Пола Керчера как правильный и добавлю остальные похожие ответы.

Ответы [ 5 ]

3 голосов
/ 19 февраля 2020

Если 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 extensions

var importantValue = path.Split(new[]{ "->" }, StringSplitOptions.None)
                         .Reverse() // reverse the enumerable
                         .Skip(1)   // discard "val"
                         .First();  // return the "ImportantValue"
2 голосов
/ 19 февраля 2020

Для этого можно использовать метод 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];

Вы также можете проверить длину результирующего массива, чтобы он содержал как минимум два элемента

2 голосов
/ 19 февраля 2020

При условии, что строка всегда имеет одинаковый формат, вы можете использовать только метод Split и извлечь предыдущий из последнего элемента массива, возвращенного из Split.

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

Просьба проверить . NET Скрипка

0 голосов
/ 19 февраля 2020

Когда важным значением является 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
0 голосов
/ 19 февраля 2020

Я полагаю, что вы можете использовать string.split с ">" в качестве массива char и получить массив. Как только вы получите массив, вы сможете перебрать массив и получить необходимое значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...