Extração de regex da string xx: xx: xx format

8

Eu sou muito novo em programação e tenho uma pergunta, estou tentando usar o método Regex para extrair horas, minutos e segundos de uma string e colocá-los em uma matriz, mas até agora posso fazê-lo com apenas um número:

 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.

Como você consegue ler uma sequência 06: 11: 33 e transformar essas horas, minutos e segundos em uma matriz de entradas? Portanto, a matriz resultante seria assim:

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

Obrigado pelo seu tempo de antecedência!

Igor Cherkasov
fonte

Respostas:

10

Se a entrada estiver neste formato (dd: dd: dd), na verdade você não precisa de regex nisso. Você pode usar o método String.Split (). Por exemplo:

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

A matriz res agora contém "23", "22", "21" como seus elementos. Você só precisa convertê-los em int.

Glennmark
fonte
Obrigado, é exatamente isso que eu precisava. Talvez eu estivesse me adiantando com Regex.
Igor Cherkasov 27/03
8

A menos que você esteja tentando aprender expressões regulares, não há razão para você executar essa análise por conta própria.

Use o TimeSpan.Parse()método para esta tarefa.

Tanveer Badar
fonte
4

Você pode usar string.Split()para obter uma matriz de elementos separados por :. Então você pode percorrer int.Parseos elementos e atribuí-los à matriz inteira.

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

Ou você pode usar o Linq Select()para fazer a análise.

int[] array = startDay.Split(':').Select(e => int.Parse(e)).ToArray();
pedaço pegajoso
fonte
4

Use Regex.Matches(string input, string pattern)assim:

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

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

A saída:

06
11
33

regex101

JQSOFT
fonte
3

Se você tiver data como uma sequência simples, poderá usar o método split:

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

Então você pode fazer a lista int usando System.Linq:

List<int> intList = arrayStr.Select(p => Convert.ToInt32(p)).ToList();
ElConrado
fonte