具有不同格式的多个正则表达式模式

时间:2016-06-29 07:44:27

标签: c# regex

我有这样的表达式,我想在totalamount和minamount之后的括号内只匹配数字

"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;

这是我的解决方案,但这是最糟糕的解决方案,我认为必须有更好的方法来匹配我的情况。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:6)

以下是我使用单一正则表达式模式的解决方案:

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

答案 1 :(得分: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();

返回(List<int>):

32604 
32604 
13456 
32604 
32604 
34677 
12345 

答案 2 :(得分:2)

我不确定为什么前两个解决方案需要环顾四周,但这里有一个没有它们的简单解决方案:

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

这将匹配参数列表并将其存储在捕获组$2中,该组可通过Groups索引Match的{​​{1}}属性访问。

示例:

2

工作示例:https://dotnetfiddle.net/m3iXF5