2013-04-05 2 views
0

Я все еще изучаю регулярное выражение, и я новичок в нем.Regex - Получение данных изнутри круглых скобок, разделенных запятыми

я следующие данные

add(2,3); 

Я хотел бы получить целые значения внутри круглых скобок «()», получая отдельные значения следующих целых чисел, разделенных «» быть сохранены как переменная в списке массива

в которой ожидаемый результат должен быть

result[0] = 2; 
result[1] = 3; 

Другой образец данных будет

add(2,3,1); 

и результат будет следующим

result[0] = 2; 
result[1] = 3; 
result[2] = 1; 

Я попытался использовать следующее выражение «@" \ d +», но когда я синтаксический анализ данных, он читает все цифры в строке , Другое выражение, которое я пробовал, это «((\ d \, \ d))», но он успешно читает первый пример, но не второй.

Весь фрагмент кода

string s = "add(2,3,1);"; 
    MatchCollection matches = Regex.Matches(s, @"\d+"); 

    string[] result = matches.Cast<Match>().Take(10).Select(match => match.Value).ToArray(); 

Пожалуйста, пожалуйста, сообщите. Спасибо.

+1

'\ d +' соответствует целое '2,3,1'? Это звучит не так. –

+0

Он соответствует индивидуальным результатам чисел. В которых им действительно не нравятся, возможно, другие числа в строках, отличных от тех, которые содержатся в '()'. – user2248001

ответ

0

Я хотел бы использовать именованные группы, и перебирать различные захваты группы, как следующее. Я добавил некоторые фиктивные цифры в тестовой строке, чтобы убедиться, что они не учитываются:

string s = "12 3 4 142 add(2 , 3,1); 21, 13 123 123,"; 
var matches = Regex.Matches(s, @"\(\s*(?<num>\d+)\s*(\,\s*(?<num>\d+)\s*)*\)"); 

foreach (Match match in matches) 
    foreach (Capture cpt in match.Groups["num"].Captures) 
     Console.WriteLine(cpt.Value); 

Чтобы сохранить снимки в массиве, вы можете использовать следующий LINQ заявление:

var result = matches.Cast<Match>() 
        .SelectMany(m => m.Groups["num"].Captures.Cast<Capture>()) 
        .Select(c => c.Value).ToArray(); 
+0

Это работает как прелесть после того, как я проверил ваш код и внес некоторые изменения. Например, добавление дополнительных данных и использование массива для доступа к дополнительным данным. Благодаря! – user2248001

0

Вместо RegEx вы могли бы рассмотреть вопрос об использовании метода, как это:

private IEnumerable<int> GetNumbers(string text) 
{ 
    var textParts = text.Split(new []{'(',')'}); 
    if (textParts.Length != 3) return new int[0]; 
    return textParts[1].Split(',').Select(n => Convert.ToInt32(n.Trim())); 
} 
0

Попробуйте это:

string s = "add(2,3,1),4"; 

      MatchCollection matches = Regex.Matches(Regex.Matches(s, @"\(.*?\)").Cast<Match>().First().ToString(), @"\d+"); 
      string[] result = matches.Cast<Match>() 
             .Take(10) 
             .Select(match => match.Value) 
             .ToArray(); 

результат [0] = 2; результат 1 = 3; результат [2] = 1;

Demo

+0

Выполняет ли код сортировку данных, если они разделены запятой? Причина в 'string s =" add (2,3,1); 4 ";' последняя цифра не разделяется запятой, а вместо нее точкой с запятой – user2248001

+0

@ user2248001 :: сначала я получаю sting в поле «()» после i отдельный номер в "()" – KF2

Смежные вопросы