使用Regex提取字符串的一部分

时间:2011-03-10 12:10:16

标签: c# .net regex

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

  

+ H124005992014011 / 1527399999999I05Z

     

+ H7039700000001 / $ 99999999I051

     

+ K122005962050171 / 120911234C117

我需要将每个部分拆分成自己的变量。要做到这一点,我认为Regex将是最好的方式。

这是分裂的规则。

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

我有以下正则表达式模式似乎与字符串匹配,但我不确定如何将这个完整模式转换为字符串和分割这些字符串的强大方法....

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

我需要将上面的模式转换为允许我提取每个匹配部分屏幕的表单。

提前致谢

1 个答案:

答案 0 :(得分:2)

您需要了解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#相同的正则表达式引擎,因此非常适合微调正则表达式!),您可以看到输出。 Regex match in Powershell