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.