【问题标题】:Match pattern and get parts of string匹配模式并获取部分字符串
【发布时间】:2021-11-23 21:02:03
【问题描述】:

我尝试用正则表达式匹配我的 C# 应用程序中的字符串:

MRT01_60DOOO3-0013577

规则是: MRT01_60D 可以包含多个下划线,例如 MRT_01_02_60D 但在最后一个下划线之后,字符串必须是: 整数 + 'D' 或整数 + 'M' 类似:

MRT_01_02_620D 或

MRT_01_02_60M 或

MRT_03_12D

最后一部分:OOO3-0013577 长度必须始终为 12 个字符,并且 '-' 在第 5 位。

检查字符串的匹配后,我想得到 4 个部分:

'MRT01'

'60D'

'OOO3-0013'

'577'

你能帮我找到正则表达式吗?

非常感谢。

埃里克。

【问题讨论】:

  • 字符串总是以“MRT”开头吗?到目前为止你有什么?
  • 指示您将'OOO3-0013577' 分解为'OOO3-0013' 和'577' 的规则是什么?
  • Andrew :字符串并不总是以 "MRT" 开头:这第一部分在其末尾由最后一个取消划线分隔。 Cary:这些部分有固定的长度:第一个为 9,第二个为 3。

标签: c# regex


【解决方案1】:
(.*)_(\d*[DM])(.{4}-.{4})(.{3})
  • (.*) 找到 MRT 部分(基本上是任何字符 (.) 任意次数 (*)
  • _ D 或 M 部分前的下划线
  • (\d*[DM]) 查找以 D 或 M ([DM]) 结尾的任意数字 (\d) 位数 (*)
  • ((.{4}-.{4})) 找到 4 个 ({4}) 任意字符 (.),中间有一个连字符和另外 4 个字符
  • (.{3}) 在末尾找到 3 个字符

查看Regex101

您要查找的所有项目都分组 (()),因此请查看比赛的第 1 至 4 组。

【讨论】:

  • Thomas:感谢您的回答,正如我对 Pavel 所说:第一部分并不总是以 MRT 开头,它可能包含多个下划线,例如:MRT_01_02_620D 或 MRT_01_02_60M 或 AKTT_03_12D
  • @eric.bryan:已更新。下次你应该指定更好或举更多例子。
  • 非常感谢 Thomas:您的解决方案完全符合我的需求。也非常感谢 Pavel 的回答。
【解决方案2】:

对于这两个字符串:

MRT01_60DOOO3-0013577
MRT_01_60MOOO3-0013577

正则表达式 (MRT.*?\d{2}).*(\d{2}D|\d{2}M)(.{4}-.{4})(.{3}) 将匹配以下内容:

group 1     MRT01
group 2     60D
group 3     OOO3-0013
group 4     577

group 1     MRT_01
group 2     60M
group 3     OOO3-0013
group 4     577

在捕获和构造字符串之后,使用您选择的语言 (C#),只需使用替换字符来替换您不想要的字符,例如 _

【讨论】:

  • Pavel:感谢您的回答,第一部分并不总是以 MRT 开头,它可能包含多个下划线,例如:MRT_01_02_620D 或 MRT_01_02_60M 或 AKTT_03_12D
猜你喜欢
  • 2011-12-10
  • 2018-04-06
  • 2014-03-22
  • 2021-02-09
  • 2019-03-20
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多