Regex-Extrakt aus dem Format der Zeichenfolge xx: xx: xx


8

Ich bin sehr neu in der Programmierung und habe eine Frage. Ich versuche, mit der Regex-Methode Stunden, Minuten und Sekunden aus einer Zeichenfolge zu extrahieren und sie in ein Array einzufügen. Bisher kann ich dies jedoch nur mit einer Zahl tun:

 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.

Wie gelingt es, aus einer Zeichenfolge 06: 11: 33 zu lesen und diese Stunden, Minuten und Sekunden in ein Array von Ints umzuwandeln? Das resultierende Array wäre also wie folgt:

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

Vielen Dank für Ihre Zeit im Voraus!

Antworten:


10

Wenn die Eingabe in diesem Format vorliegt (dd: dd: dd), benötigen Sie in diesem Format keinen regulären Ausdruck. Sie können die String.Split () -Methode verwenden. Zum Beispiel:

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

Das res-Array enthält jetzt "23", "22", "21" als Elemente. Sie müssen sie nur dann in int konvertieren.


Danke, genau das habe ich gebraucht. Vielleicht war ich mit Regex vor mir.
— Igor Cherkasov

8

Wenn Sie nicht versuchen, reguläre Ausdrücke zu lernen, gibt es keinen Grund für Sie, diese Analyse selbst durchzuführen.

Verwenden Sie die TimeSpan.Parse()Methode für diese Aufgabe.


4

Sie können verwenden string.Split(), um ein Array von Elementen zu erhalten, die durch getrennt sind :. Dann können Sie int.Parsedie Elemente durchlaufen und sie dem Integer-Array zuweisen.

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

Oder Sie können Linqs verwenden Select(), um das Parsen durchzuführen.

int[] array = startDay.Split(':').Select(e => int.Parse(e)).ToArray();

4

Verwenden Sie Regex.Matches(string input, string pattern)wie folgt:

var results = Regex.Matches(startDay, @"\d+");
var array = (from Match match in results
             select Convert.ToInt32(match.Value))
            .ToArray();


4

RegEx Weg:

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));

Die Ausgabe:

06
11
33

regex101


3

Wenn Sie das Datum als einfache Zeichenfolge haben, können Sie die Split-Methode verwenden:

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

Dann können Sie mit System.Linq eine int-Liste erstellen:

List<int> intList = arrayStr.Select(p => Convert.ToInt32(p)).ToList();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.