Выдержка Regex из строки xx: xx: xx - PullRequest
8 голосов
/ 27 марта 2020

Я очень новичок в программировании и у меня есть вопрос, я пытаюсь использовать метод Regex, чтобы извлечь часы, минуты и секунды из строки и поместить их в массив, но пока я могу сделать это только с одним числом :

 int initialDay D = 0;
 string startDay = Console.ReadLine(); //input:  "It started 5 days ago"
 var resultString = Regex.Match(startDay, @"\d+").Value; 
 initialDay = Int32.Parse(resultString);   // initialDay here equals 5.

Как удается прочитать строку 06: 11: 33 и преобразовать эти часы, минуты и секунды в массив целых чисел? Таким образом, полученный массив будет выглядеть так:

int[] array = new int[] {n1, n2, n3}; // the n1 would be 6, n2 would be 11 and n3 would be 33

Спасибо, что уделили время заранее!

Ответы [ 7 ]

10 голосов
/ 27 марта 2020

Если ввод в этом формате (дд: дд: дд), вам на самом деле не нужно регулярное выражение в этом. Вы можете использовать метод String.Split (). Например:

string test = "23:22:21";
string []res = test.Split(':');

Теперь массив res будет содержать «23», «22», «21» в качестве элементов. Вам просто нужно преобразовать их в int.

8 голосов
/ 27 марта 2020

Если вы не пытаетесь изучать регулярные выражения, у вас нет причин выполнять этот анализ самостоятельно.

Используйте метод TimeSpan.Parse() для этой задачи.

4 голосов
/ 27 марта 2020

Вместо регулярного выражения вы можете использовать TimeSpan.Parse (). Проверьте его https://docs.microsoft.com/pl-pl/dotnet/api/system.timespan.parse?view=netframework-4.8

4 голосов
/ 27 марта 2020

Способ RegEx:

var pattern = @"(\d{1,2})\s?\:\s?(\d{1,2})\s?\:\s?(\d{1,2})";
var input = "06 : 11 : 33";
var arr = Regex.Matches(input, pattern)
    .Cast<Match>()
    .SelectMany(x => x.Groups.Cast<Group>()
    .Skip(1)
    .Select(y => int.Parse(y.Value)))
    .ToArray();

Console.WriteLine(string.Join("\n", arr));

Выход:

06
11
33

regex101

4 голосов
/ 27 марта 2020

Вы можете использовать string.Split(), чтобы получить массив элементов, разделенных :. Затем вы можете l oop через него, int.Parse элементы и присвоить их целочисленному массиву.

string[] buffer = startDay.Split(':');
int[] array = new int[buffer.Length];
for (int i = 0; i < buffer.Length; i++)
{
    array[i] = int.Parse(buffer[i]);
}

Или вы можете использовать Select() Linq для выполнения анализа.

int[] array = startDay.Split(':').Select(e => int.Parse(e)).ToArray();
4 голосов
/ 27 марта 2020

Используйте Regex.Matches(string input, string pattern) как это:

var results = Regex.Matches(startDay, @"\d+");
var array = (from Match match in results
             select Convert.ToInt32(match.Value))
            .ToArray();
3 голосов
/ 27 марта 2020

Если у вас дата в виде простой строки, вы можете использовать метод разбиения:

string dataString = "06 : 11 : 33";
string[] arrayStr = dataString.Split(':');

Затем вы можете создать список int, используя System.Linq:

List<int> intList = arrayStr.Select(p => Convert.ToInt32(p)).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...