用于在 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# 中获取字符串中的数值的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

从字符串正则表达式 PHP 中提取数值 [关闭]

c#用正则表达式提取小括号中的内容

C#常用正则表达式回顾

正则表达式使用 C# 从字符串中获取值

了解下C# 正则表达式

正则表达式 - 空白无法获取整数值