C#Regex获取带十进制数的特定字符

时间:2016-09-28 09:44:05

标签: c# regex

我需要一个正则表达式,它返回特定字符,最小值为1位

我有字符串文字

(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14

应用正则表达式后得到以下结果

AvgC20, MaxC20, MinC20

这是我正在使用的正则表达式

(Avg|Max|Min)[OHLVC]\d+

返回我想要的但不会将十进制数字返回到一个地方

但我需要这样的结果

AvgC20.1, MaxC20, MinC20.1

1 个答案:

答案 0 :(得分:4)

添加一个(?:\.\d+)?匹配的.匹配的1或0个匹配项,后跟一个或多个数字:

(?:Avg|Max|Min)[OHLVC]\d+(?:\.\d+)?
                         ^^^^^^^^^^

请参阅regex demo

enter image description here

(?:...)?是可选的non-capturing group。它是可选的(=匹配一次或零次)由于?量词(一个贪婪的,这就是为什么我提到一个或零,而不是零或一个)。非捕获组用于分组目的,而不为存储器中捕获的值创建缓冲区。我建议使用 -capturing组,因为最终结果应该等于整个匹配值,因此,不需要跟踪和存储这些子值。

对.NET中的非/捕获组的说明:在.NET代码中,您实际上可以使用编号的捕获组,并使用RegexOptions.ExplicitCapture标志使其不可捕获。然后,仅为命名捕获组(如(?<gr1>...))创建内存缓冲区。

模式详情

  • (?:Avg|Max|Min) - AvgMaxMin
  • [OHLVC] - 集合中的一个大写字母
  • \d+ - 一位或多位
  • (?:\.\d+)? - 一个.的可选序列,后跟一个或多个数字。

旁注:最佳做法是禁止同一个轮换组的分支在同一个位置匹配,(?:Avg|Max|Min)更好地写为(?:Avg|M(?:ax|in))。然而,对于人类来说,对机器有益的不是那么好,所以由于可读性的原因,我建议保持第一组不变。

C# demo(请注意RegexOptions.ExplicitCapture是在内联(?n)选项的帮助下传递的:

var s = "(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14";
var pattern = @"(?n)(Avg|Max|Min)[OHLVC]\d+(\.\d+)?";
var result = Regex.Matches(s, pattern)
        .Cast<Match>()
        .Select(p => p.Value)
        .ToList();
foreach (var r in result) // Demo printing the results
    Console.WriteLine(r);