我有这样的表达式,我想在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;
这是我的解决方案,但这是最糟糕的解决方案,我认为必须有更好的方法来匹配我的情况。有人可以帮忙吗?
答案 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