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!

Igor Cherkasov
quelle

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.

Glennmark
quelle
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.

Tanveer Badar
quelle
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();
klebriges Stück
quelle
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();
NoGTNoHappy
quelle
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

JQSOFT
quelle
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();
ElConrado
quelle