首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#正则表达式用十进制数得到特定字符

C#正则表达式用十进制数得到特定字符
EN

Stack Overflow用户
提问于 2016-09-28 09:44:05
回答 1查看 151关注 0票数 3

我需要一个正则表达式,它返回一个十进制数最多1位的特定字符。

我有字符串文本

代码语言:javascript
复制
(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14

在应用regex之后,得到以下结果

代码语言:javascript
复制
AvgC20, MaxC20, MinC20

这是我使用的正则表达式

代码语言:javascript
复制
(Avg|Max|Min)[OHLVC]\d+

它返回我想要的,但不将十进制数返回到一个位置。

但我需要这样的结果

代码语言:javascript
复制
AvgC20.1, MaxC20, MinC20.1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-28 09:46:24

添加一个可选的(?:\.\d+)?,匹配1或0次出现的.,后面跟着1或更多位数:

代码语言:javascript
复制
(?:Avg|Max|Min)[OHLVC]\d+(?:\.\d+)?
                         ^^^^^^^^^^

regex演示

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

注意:在.NET 中的非捕获组上:在.NET代码中,实际上可以使用编号的捕获组,并通过使用RegexOptions.ExplicitCapture标志使它们不捕获。然后,只为命名捕获组(如(?<gr1>...))创建内存缓冲区。

模式细节

  • (?:Avg|Max|Min) - AvgMaxMin
  • [OHLVC] -一封来自套装的大写字母
  • \d+ -1或更多位数
  • (?:\.\d+)? -一个可选的.序列,后面跟着一个或更多位数。

Sidenote:最好的做法是不允许同一个交替组的分支在同一个位置匹配,(?:Avg|Max|Min)最好写成(?:Avg|M(?:ax|in))。然而,对机器的好处并不是对人眼那么好,所以出于可读性的原因,我建议保持第一组的原样。

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

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39743723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档