用于在 C# 中获取字符串中的数值的正则表达式
Posted
技术标签:
【中文标题】用于在 C# 中获取字符串中的数值的正则表达式【英文标题】:Regex for obtaining numeric values within a string in C# 【发布时间】:2021-08-03 09:34:06 【问题描述】:我有以下示例字符串:
TAR:100
TAR:100|LED:50
TAR:30|LED:30|ASO:40
我需要一个正则表达式来获取冒号后面的数值,这些数值始终在 0 到 100 的范围内。
将正则表达式应用于上述任何字符串后的结果应该是:
对于TAR:100
,结果应该是100
对于TAR:100|LED:50
,结果应该是数组[100,50]
对于TAR:30|LED:30|ASO:40
,结果应该是数组[30,30,40]
冒号前的单词可以是任意长度,大小写均可。
我尝试了以下方法,但没有产生我需要的结果:
String text = "TAR:100|LED:50";
String pattern = "\\|?([a-zA-Z]1,:)";
string[] values= Regex.Split(text, pattern);
如果可能,无论字符串是TAR:100
还是TAR:100|LED:50
,正则表达式都应该有效。
【问题讨论】:
【参考方案1】:您添加了()
,这使得您要删除的文本部分也被返回。
以下是我的解决方案,正则表达式略有改动。
请注意,我们需要开始循环i = 1
处的值,这纯粹是由于在以拆分序列开始的字符串上使用Split引起的;它与正则表达式本身无关。
解释:如果我们用一个更简单的str.Split用分隔符“#”分割,那么“a#b#c”会产生[“a”,“b”,“c”],而“#b#c”会产生 ["", "b", "c"]。一般来说,根据定义:如果 Split 删除了 N 个用来分割字符串的序列,那么结果是 N+1 个字符串。而且我们这里处理的所有字符串都是“#b#c”形式的,所以第一个结果总是空的。
接受作为给定事实的结果,从i = 1
开始即可使用:
var pattern = @"\|?[a-zA-Z]+:";
var testCases = new[] "TAR:100", "TAR:100|LED:50", "TAR:30|LED:30|ASO:40" ;
foreach (var text in testCases)
string[] values = Regex.Split(text, pattern);
for (var i = 1; i < values.Length; i++)
Console.WriteLine(values[i]);
Console.WriteLine("------------");
输出:
100
------------
100
50
------------
30
30
40
------------
工作 DotNetFiddle:https://dotnetfiddle.net/i9kH8n
【讨论】:
谢谢。知道为什么结果数组的第一个元素是空格吗? 我仔细考虑了一下,找到了(不可避免的)空结果的解释。查看更新后的答案。【参考方案2】:在 .NET 中,您可以使用 Group.Captures 并为 2 个捕获组使用相同的名称并匹配字符串的格式。
\b[a-zA-Z]+:(?<numbers>[0-9]+)(?:\|[a-zA-Z]+:(?<numbers>[0-9]+))*\b
Regex demo | C# demo
string[] strings =
"TAR:100",
"TAR:100|LED:50",
"TAR:30|LED:30|ASO:40"
;
string pattern = @"\b[a-zA-Z]+:(?<numbers>[0-9]+)(?:\|[a-zA-Z]+:(?<numbers>[0-9]+))*\b";
foreach (String str in strings)
Match match = Regex.Match(str, pattern);
if (match.Success)
string[] result = match.Groups["numbers"].Captures.Select(c => c.Value).ToArray();
Console.WriteLine(String.Join(',', result));
输出
100
100,50
30,30,40
另一种选择是使用 \G
锚点,并在捕获组 1 中具有值。
\b(?:[a-zA-Z]+:|\G(?!^))([0-9]+)(?:\||$)
Regex demo | C# demo
string[] strings =
"TAR:100",
"TAR:100|LED:50",
"TAR:30|LED:30|ASO:40"
;
string pattern = @"\b(?:[a-zA-Z]+:|\G(?!^))([0-9]+)(?:\||$)";
foreach (String str in strings)
MatchCollection matches = Regex.Matches(str, pattern);
string[] result = matches.Select(m => m.Groups[1].Value).ToArray();
Console.WriteLine(String.Join(',', result));
输出
100
100,50
30,30,40
【讨论】:
以上是关于用于在 C# 中获取字符串中的数值的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章