正则表达式 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# - 中间的可选组的主要内容,如果未能解决你的问题,请参考以下文章