【问题标题】:Extracting parts of a string using Regex使用正则表达式提取字符串的一部分
【发布时间】:2011-07-12 16:16:49
【问题描述】:

我有几个字符串,如下所示:

+H124005992014011/1527399999999I05Z

+H7039700000001/$99999999I051

+K122005962050171/120911234C117

我需要将每个部分拆分为自己的变量。为此,我认为 Regex 将是最好的方法。

这里是拆分规则。

  • 第一个字符必须是“+”
  • 第二部分必须有一个字母字符后跟三位数字。即 H124、H703、K122
  • 第三部分是一组字母数字字符(长度为 1 到 13 个字符)
  • 第四部分是一个十进制数字(0 到 9)
  • 第五部分必须是'/'字符
  • 第六部分是明确的五位儒略日期代码
  • 第七部分是一个 0 到 13 的字母数字字符串
  • 第八部分必须有一个字母字符(A 到 L),后跟两位数字
  • 而第九部分是单个字母数字字符

我有以下正则表达式模式,它似乎可以很好地匹配字符串,但我不确定如何将这个完整模式转换为字符串以及拆分这些字符串的可靠方法....

(^\+)(\D\d\d\d)(\w{1,13})(\d)(\/)(\d{5}|\$)(\w{0,13})\D\d\d\w$

我需要将上述模式转换成一种形式,以便提取每个匹配的部分屏幕。

提前致谢

【问题讨论】:

  • 我不明白你的问题是什么。你可以说得更详细点吗?您的正则表达式可能会更好,但如果您不使用它来验证输入,而只是提取数据,它应该可以工作。您需要做的就是再添加两个组来捕获最后的部分。

标签: c# .net regex


【解决方案1】:

您需要了解capturing groups。基本上,将您关心的每个“组”括在括号中。然后你可以通过它们的序号来引用这些组。

有关在 C# 中使用捕获组,请参阅 this question

您描述的正则表达式与您的输入不完全匹配 - 请参阅以下 powershell 脚本。

# Note, I have used **single-quotes**. This is VERY IMPORTANT!
# Powershell interprets a $ as a variable, unless it is inside single-quotes.

# This regex is as described in your comment
$regex = '^(\+)([a-zA-Z]\d{3})(\w{1,13})(\d)(/)(\d{5})(\w{0,13})([A-L]\d{2})(\w)$'
'+H124005992014011/1527399999999I05Z' -match $regex # TRUE
'+H7039700000001/$99999999I051' -match $regex # FALSE
'+K122005962050171/120911234C117' -match $regex # FALSE

# This regex matches all your sample input.
$regex = '^(\+)([a-zA-Z]\d{3})(\w{1,13})(\d)(/)([\d{5}|\$])(\w{0,13})([A-L]\d{2})(\w)$'
'+H124005992014011/1527399999999I05Z' -match $regex 
'+H7039700000001/$99999999I051' -match $regex 
'+K122005962050171/120911234C117' -match $regex

使用 Powershell(它使用与 C# 相同的正则表达式引擎,因此非常适合微调您的正则表达式!),您可以看到输出。

【讨论】:

  • 但 '\' 将 '$' 转义为文字,因为有时字符串中不存在朱利安日期
  • 我的意思是您的书面描述与您的正则表达式不匹配 - 您没有在书面描述中谈论 $ 符号...
  • 我忘记了,抱歉 :)
  • 这是我第一次真正以自定义方式使用正则表达式。在此之前我只使用过通用模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多