我需要一个正则表达式,它返回特定字符,最小值为1位
我有字符串文字
(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14
应用正则表达式后得到以下结果
AvgC20, MaxC20, MinC20
这是我正在使用的正则表达式
(Avg|Max|Min)[OHLVC]\d+
返回我想要的但不会将十进制数字返回到一个地方
但我需要这样的结果
AvgC20.1, MaxC20, MinC20.1
答案 0 :(得分:4)
添加一个(?:\.\d+)?
匹配的.
匹配的1或0个匹配项,后跟一个或多个数字:
(?:Avg|Max|Min)[OHLVC]\d+(?:\.\d+)?
^^^^^^^^^^
请参阅regex demo
(?:...)?
是可选的non-capturing group。它是可选的(=匹配一次或零次)由于?
量词(一个贪婪的,这就是为什么我提到一个或零,而不是零或一个)。非捕获组用于分组目的,而不为存储器中捕获的值创建缓冲区。我建议使用非 -capturing组,因为最终结果应该等于整个匹配值,因此,不需要跟踪和存储这些子值。
对.NET中的非/捕获组的说明:在.NET代码中,您实际上可以使用编号的捕获组,并使用RegexOptions.ExplicitCapture
标志使其不可捕获。然后,仅为命名捕获组(如(?<gr1>...)
)创建内存缓冲区。
模式详情:
(?:Avg|Max|Min)
- Avg
,Max
或Min
[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);