2016-06-29 3 views
2

у меня есть выражение, как это и я хочу соответствовать только цифры внутри круглых скобок только после того, как из totalamount и MINAMOUNTMultiple Regex Pattern с различными форматами

"test test test test totalamount(32604) > 0m)" 
"test test test test totalamount(32604, 13456) > 0m)" 
"test test test test minamount(32604) > 0m)" 
"test test test test minamount(32604, 34677, 12345) > 0m)" 

Так что, если я мог бы правильный шаблон мой вывод должен быть

1- 32604 
2- 32604, 13456 
3- 32604 
4- 32604, 34677, 12345 





Regex regex = new Regex(@"(totalamount)\((\d*)(\,\d*)"); 
Regex regex2 = new Regex(@"(totalamount)\((\d*)(\d*)"); 
Regex regex3 = new Regex(@"(minamount)\((\d*)(\,\d*)"); 
Regex regex4 = new Regex(@"(minamount)\((\d*)(\d*)"); 

return regex.Match(expression).Success ? regex.Match(expression) : 
        regex2.Match(expression).Success ? regex2.Match(expression): 
        regex3.Match(expression).Success ? regex3.Match(expression) : 
        regex4.Match(expression).Success ? regex4.Match(expression) : null; 

Вот мое решение, но это худшее решение, я думаю, должен быть лучший способ соответствовать моему делу. Может ли кто-нибудь помочь?

+0

Вы имеете в виду "лучшее решение": единый шаблон регулярного выражения? Если нет, пожалуйста, будьте более конкретными. –

+0

yeap single regex pattern абсолютно лучшее решение –

ответ

5

Другое решение:

List<string> ls = new List<string>() 
       { 
       "test test test test totalamount(32604) > 0m)", 
       "test test test test totalamount(32604, 13456) > 0m)", 
       "test test test test minamount(32604) > 0m)", 
       "test test test test minamount(32604, 34677, 12345) > 0m)" 
       }; 

string pattern = @"(?<=(?:total|min)amount\(|\G(?!^)[ ,]*)\d+"; 
var result = ls.SelectMany(s => 
      Regex.Matches(s, pattern).Cast<Match>() 
        .Select(m=>Convert.ToInt32(m.Value))) 
       .ToList(); 

Returns (List<int>):

32604 
32604 
13456 
32604 
32604 
34677 
12345 
+0

Первый комментарий принят ответ спасибо –

+0

Спасибо, @MehmetErenYener. –

6

Вот мое решение с одним регулярных выражений шаблона, используя изменения:

(?<=(total|min)(amount)\()\d*((\,)*\d*)* 
2

Я не конечно, почему предыдущие два решения нуждаются в обходах, но здесь прост без них:

(total|min)amount\(([\d,\s]+)\) 

Это будет соответствовать список аргументов и сохранить его в группе захвата $2 доступ к которой осуществляется через Groups свойство Match по индексу 2.

Пример:

var expressions = new [] 
{ 
    "test test test test totalamount(32604) > 0m)", 
    "test test test test totalamount(32604, 13456) > 0m)", 
    "test test test test minamount(32604) > 0m)", 
    "test test test test minamount(32604, 34677, 12345) > 0m)" 
}; 


var numbers = new Regex(@"(total|min)amount\(([\d,\s]+)\)"); 

foreach (var expression in expressions) 
    Console.WriteLine(numbers.Match(expression).Groups[2]); 

Рабочий пример: https://dotnetfiddle.net/m3iXF5