Trích xuất Regex từ định dạng chuỗi xx: xx: xx


8

Tôi rất mới với lập trình và tôi có một câu hỏi, tôi đang cố gắng sử dụng phương thức Regex để trích xuất giờ, phút và giây từ một chuỗi và đặt chúng vào một mảng, nhưng cho đến nay tôi có thể làm điều đó chỉ với một số:

 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.

Làm cách nào để quản lý để đọc từ một chuỗi 06: 11: 33 và biến đổi các giờ, phút và giây này thành một mảng các số nguyên? Vì vậy, mảng kết quả sẽ như thế này:

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

Cảm ơn bạn đã dành thời gian của bạn trước!

Câu trả lời:


10

Nếu đầu vào ở định dạng này (dd: dd: dd), bạn thực sự không cần regex trong này. Bạn có thể sử dụng phương thức String.Split (). Ví dụ:

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

Mảng res bây giờ sẽ chứa "23", "22", "21" làm các phần tử của nó. Bạn chỉ cần chuyển đổi chúng thành int.


Cảm ơn bạn, đây chính xác là những gì tôi cần. Có lẽ tôi đã vượt lên chính mình với Regex.
Igor Cherkasov

8

Trừ khi bạn đang cố gắng học các biểu thức thông thường, không có lý do gì để bạn tự thực hiện phân tích cú pháp này.

Sử dụng TimeSpan.Parse()phương pháp cho nhiệm vụ này.


4

Bạn có thể sử dụng string.Split()để có được một mảng các phần tử được phân tách bằng :. Sau đó, bạn có thể lặp qua nó, int.Parsecác phần tử và gán chúng cho mảng số nguyên.

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

Hoặc bạn có thể sử dụng Linq Select()để phân tích cú pháp.

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

4

Sử dụng Regex.Matches(string input, string pattern)như thế này:

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


4

Cách 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));

Đầu ra:

06
11
33

regex101


3

Nếu bạn có ngày là chuỗi đơn giản, bạn có thể sử dụng phương pháp phân tách:

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

Sau đó, bạn có thể tạo danh sách int bằng System.Linq:

List<int> intList = arrayStr.Select(p => Convert.ToInt32(p)).ToList();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.