我需要一个正则表达式,它返回一个十进制数最多1位的特定字符。
我有字符串文本
(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14在应用regex之后,得到以下结果
AvgC20, MaxC20, MinC20这是我使用的正则表达式
(Avg|Max|Min)[OHLVC]\d+它返回我想要的,但不将十进制数返回到一个位置。
但我需要这样的结果
AvgC20.1, MaxC20, MinC20.1发布于 2016-09-28 09:46:24
添加一个可选的(?:\.\d+)?,匹配1或0次出现的.,后面跟着1或更多位数:
(?:Avg|Max|Min)[OHLVC]\d+(?:\.\d+)?
^^^^^^^^^^见regex演示

(?:...)?是一个可选的组。它是可选的(=匹配一次或零次),原因是?量词(贪婪的),这就是为什么我提到一个或零,而不是零或一个)。非捕获组用于分组目的,而不为内存中捕获的值创建缓冲区。我建议使用非捕获组,因为最终结果应该等于整个匹配值,因此,不需要跟踪和存储这些子值。
注意:在.NET 中的非捕获组上:在.NET代码中,实际上可以使用编号的捕获组,并通过使用RegexOptions.ExplicitCapture标志使它们不捕获。然后,只为命名捕获组(如(?<gr1>...))创建内存缓冲区。
模式细节
(?:Avg|Max|Min) - Avg,Max或Min[OHLVC] -一封来自套装的大写字母\d+ -1或更多位数(?:\.\d+)? -一个可选的.序列,后面跟着一个或更多位数。Sidenote:最好的做法是不允许同一个交替组的分支在同一个位置匹配,(?:Avg|Max|Min)最好写成(?:Avg|M(?:ax|in))。然而,对机器的好处并不是对人眼那么好,所以出于可读性的原因,我建议保持第一组的原样。
C#演示 (注意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);https://stackoverflow.com/questions/39743723
复制相似问题