Разобрать строку, чтобы получить часть строки - PullRequest
1 голос
/ 07 апреля 2020

У меня есть строка

"(01 Jan 2019 to 03 Jun 2020)"

Мне нужна только часть вторая дата , которая равна Dynami c, поэтому день не всегда "03 Jun 2020" это может быть "12 Apr 2020" например

Как мне извлечь Substring из этой конкретной строки?

Ответы [ 5 ]

4 голосов
/ 07 апреля 2020

Это работает для любой строки в формате "(дата1 до дата2)".

var dateString = "(01 Jan 2019 to 03 Jun 2020)";
var indexOfTo = dateString.IndexOf("to");
//If "to" isn't in the string
if (indexOfTo == -1)
    throw new InvalidOperationException();
var result = dateString.Substring(indexOfTo + 3).Replace(")", string.Empty);
2 голосов
/ 07 апреля 2020

Другой подход:

var dates = input.Split(" to ", StringSplitOptions.None);
//if array dates length is not 2, you know you have an invalid format
//take appropiate measures if necessary

var firstDate = dates[0].TrimStart('(');
var secondDate = dates[1].TrimEnd(')');

Поучительно узнать о других удобных строковых методах, которые помогут вам решить подобные проблемы.

Нет проверки ошибок, если неправильный формат строки Возможно, вам придется сделать необходимые проверки.

1 голос
/ 07 апреля 2020

Вы можете объединить регулярные выражения для получения хороших кандидатов для DateTime с, а затем TryParseExact для анализа действительных из них в окончательные DateTime:

using System.Linq;
using System.Text.RegularExpressions;
...

private static DateTime[] ExtractDates(string value, IFormatProvider provider = null) {
  return Regex
    .Matches(value, @"\b[0-9]{1,2}\s+[A-Z][a-z]+\s+[0-9]{4}\b")
    .Cast<Match>()
    .Select(match => (DateTime.TryParseExact(
       match.Value, 
      "d MMM yyyy", 
       provider, 
       DateTimeStyles.AssumeLocal, 
       out DateTime result), result))
    .Where(tuple => tuple.Item1)
    .Select(tuple => tuple.result)
    .ToArray();
}

Например:

DateTime[] result = ExtractDates(
  "(from 01 Jan 2019 up and including to 03 Jun 2020)", 
   CultureInfo.InvariantCulture);

// 3 June 2020
DateTime secondPart = result[1]; 
0 голосов
/ 07 апреля 2020

Вы можете заменить ")" и "(" пустыми строками, разделить на "to", а затем обрезать оставшиеся пробелы.

var test = "(01 Jan 2019 to 03 Jun 2020)";

var result = test
    .Replace("(", string.Empty)
    .Replace(")", string.Empty)
    .Split("to")
    .Select(s => s.Trim());

Console.WriteLine($"First part: {result.ElementAt(0)}");
Console.WriteLine($"Second part: {result.ElementAt(1)}");

Вывод:

First part: 01 Jan 2019
Second part: 03 Jun 2020

Некоторые удобные строковые методы, показанные выше:

Так как я сохранил result как IEnumerable<string>, я проиндексировал его Enumerable.ElementAt(). Если вы хотите индексировать с result[0] и result[1], вам нужно преобразовать результат в список или массив. Это можно сделать с помощью Enumerable.ToList() и Enumerable.ToArray() от LINQ. Я также использовал Enumerable.Select() для проецирования струн в урезанные версии с Trim().

0 голосов
/ 07 апреля 2020

Вы можете использовать <yourStringName>.substring(15) (кажется, я считал правильно), чтобы получить только второе свидание и манипулировать, как вам угодно.

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