2016-07-20 2 views
0

Новое в использовании C# Regex, я пытаюсь захватить целые целые числа, разделенные запятой, из строки на две переменные.Easy Regex capture

Пример: 13,567

Я попытался вариации на

Regex regex = new Regex(@"(\d+),(\d+)"); 
var matches = regex.Matches("12,345"); 

foreach (var itemMatch in matches) 
    Debug.Print(itemMatch.Value); 

Это только захватывает 1 переменную, которая вся строка. Я сделал это, изменив шаблон захвата на "(\d+)", но затем полностью игнорирует среднюю запятую, и я бы получил совпадение, если бы между целыми числами был текст. Как получить его для извлечения обоих целых чисел и убедиться, что он также видит запятую между ними.

+0

почему разве вы не используете 'split'? –

+2

В вашем матче вам нужно посмотреть на 'Groups' – Chris

+0

Я думаю, я мог бы, но поскольку я не использовал регулярное выражение, прежде чем я подумал, что это простой пример, чтобы немного узнать об этом. Мне показалось, что это расстраивает неловко, и еще предстоит решить эту проблему. Так что оцените решение с использованием регулярного выражения. Спасибо – geoffw123

ответ

3

Можно сделать это с String.Split

Почему бы просто не использовать раскол и разобрать?

var results = "123,456".Split(',').Select(int.Parse).ToArray(); 
var left = results[0]; 
var right = results[1]; 

В качестве альтернативы, вы можете использовать цикл и использовать int.TryParse для обработки сбоев, но за то, что вы ищете, это должно покрыть его

Если вы действительно привержены Regex

You может сделать это с Regex тоже, просто нужно использовать группы матча

Regex r = new Regex(@"(\d+)\,(\d+)", RegexOptions.Compiled); 
var r1 = r.Match("123,456"); 

//first is total match 
Console.WriteLine(r1.Groups[0].Value); 

//Then first and second groups 

var left = int.Parse(r1.Groups[1].Value); 
var right = int.Parse(r1.Groups[2].Value); 

Console.WriteLine("Left "+ left); 
Console.WriteLine("Right "+right); 

сделал dotnetfiddle вы можете протестировать решение, как хорошо

+2

Вопрос не в том, как разделить строку, а о том, как получить доступ к группам захвата. Всем известно, как разбить строку. –

+0

@ WiktorStribiżew вопрос был о Regex, но решение было доступно с помощью split, добавлено, как выполнить то, что OP ищет wth также Regex – konkked

0

С Regex, вы можете использовать это:

Regex regex = new Regex(@"\d+(?=,)|(?<=,)\d+"); 
var matches = regex.Matches("12,345"); 

foreach (Match itemMatch in matches) 
    Console.WriteLine(itemMatch.Value); 

принты:

12 
345 

На самом деле это делает смотреть вперед и смотреть-за ,:

\d+(?=,)  <---- // Match numbers followed by a , 
|   <---- // OR 
(?<=,)\d+ <---- // Match numbers preceeded by a , 
+1

Дело не в том, как писать «лучшее» регулярное выражение, а как получить доступ к захваченному значения. –

+0

Eugh, пахнущие соли, понравились! Для того, что я думал, это простая проблема, это ужасающий шаблон регулярных выражений для newb для понимания. – geoffw123

+0

@ geoffw123 не думаю, что полезно делать подобные комментарии лично, можно просто сказать, что он выглядит сложным ... что, как говорится, согласны с тем, что это выглядит как субоптимальный способ решения проблемы. – konkked