正则表达式 C# - 中间的可选组

Posted

技术标签:

【中文标题】正则表达式 C# - 中间的可选组【英文标题】:Regex C# - optional group in the middle 【发布时间】:2021-10-06 06:48:52 【问题描述】:

我有这样的源文本,中间有一个可选组:

GH22-O0-TFS-SFSD 00-1-006.19135
GH22-O0-TFS-SFSD 00-1-006.1.19135

第一种情况下的期望值为“19135”,第二种情况下为“1.19135”。

正则表达式必须匹配整个字符串并选择第一个“。”之后的所有字符。 - 这是我的第 1 组。我尝试创建子组并将第 3 组标记为可选,但它不起作用。

正则表达式:

.*\.0*(([0-9])(\.0*([0-9]+)))

应如何更改以获取所需的值?

【问题讨论】:

第一个周期后得到所有东西? regexr.com/3elkd 建议的解决方案不行,因为正如我所提到的:正则表达式应该匹配整个文本并选择值作为一个组。 您似乎需要锚点、开头的惰性点图案和可选的非捕获组。 【参考方案1】:

这应该适合你:

.*?\.(.*)

这将匹配整个字符串,并包括捕获组 1 中第一个句点之后的所有内容,无论字符类型如何。

【讨论】:

【参考方案2】:

你可以使用

^(.*?)\.0*(\d+)(?:\.0*(\d+))?$

请参阅regex demo。 详情

^ - 字符串开头 (.*?) - 第 1 组:除 LF 字符之外的任何零个或多个字符,尽可能少(因为 *? 是一个惰性量词) \. - 一个点 0* - 零个或多个零 (\d+) - 第 2 组:任意一位或多位数字 (?:\.0*(\d+))? - . 的可选出现,零个或多个零,然后第 3 组捕获一个或多个数字 $ - 字符串结束。

【讨论】:

【参考方案3】:

我希望我了解您的目标,这应该可行:

.*?\.([\d.]+)
.*?\. - 大致捕捉到第一阶段之前的所有内容 ([\d.]+) - 将剩余的数字和句点捕获到捕获组 #1

https://regex101.com/r/0t9Ijy/1

【讨论】:

以上是关于正则表达式 C# - 中间的可选组的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 c# 可选组 - 应该贪婪吗?

c# 正则表达式捕获

匹配正则表达式中的可选斜杠

在正则表达式的可选部分中捕获的组

使用正则表达式匹配日志文件行时的可选字段

正则表达式省略 UPN 或 displayName 中的可选前缀