具有固定开始和结束以及内部重复组的正则表达式

时间:2015-10-08 19:56:32

标签: regex vb.net repeat

VB2012:我有一个我要解析的字符串。它有一个固定的开始和结束字符串,但里面有重复的字符串。

输入字符串看起来像这样,在START和END之间有更多相同类型的数据。

START;data[0][1]="2000";data[0][2]="2015-09-25";data[0][3]="XYZ";END;

我目前的正则表达式看起来像这样

(data\[(?<row>\d{1,2})]\[(?<col>\d{1,2})]="(?<val>.*?)";)

效果很好并匹配里面重复的字符串:

Match Number    Match Text                      Group 1                             row col val
0               "data[0][1]=""2000"";"          "data[0][1]=""2000"";"              "0" "1" "2000"
1               "data[0][2]=""2015-09-25"";"    "data[0][2]=""2015-09-25"";"        "0" "2" "2015-09-25"
2               "data[0][3]=""XYZ"";"           "data[0][3]=""XYZ"";"               "0" "3" "XYZ"

我想通过匹配START字符串,然后重复字符串,然后匹配END字符串来使匹配更准确。我的尝试形式如下:

START;(data\[(?<row>\d{1,2})]\[(?<col>\d{1,2})]="(?<val>.*?)";)*END;

但是这给了我一个输出,其中不同的组是独立的,而不是更大匹配的一部分。我坚持我应该尝试的东西。

1 个答案:

答案 0 :(得分:1)

我们举个例子:

START;data[0][1]="2000";data[0][2]="2015-09-25";data[0][3]="XYZ";END;

以及你的第二个正则表达式:

START;(data\[(?<row>\d{1,2})]\[(?<col>\d{1,2})]="(?<val>.*?)";)*END;

那么,我们得到什么?

模式包含在START;( ... [values] ... )*END;中,您正在使用*量词。 [values] 部分还有其他捕获组。

所以,匹配看起来像这样:

START;data[0][1]="2000";data[0][2]="2015-09-25";data[0][3]="XYZ";END;
           R  C   VVVV       R  C   VVVVVVVVVV       R  C   VVV        <-- groups
      \________________/\______________________/\_______________/      <-- [values]
\___________________________________________________________________/  <-- full match

正则表达式的 [values] 部分匹配3次。 R组是row组捕获的值,Ccol捕获的值,VVVval捕获的值。 / p>

在这种情况下,大多数其他正则表达式引擎会丢弃除最后一次捕获之外的所有引擎,并且您只从匹配中获得值03XYZ

但.NET支持每组多次捕获。因此,对于封闭的*量词的每次迭代,您可以提取所有捕获的子串。

  • Match.Groups中的每个项目都对应于模式中的捕获组(例如(?<row> ... )组)。
  • Match.Groups("row").Captures中的每个项目对应于比赛期间量词的迭代中的给定捕获

这意味着,在匹配期间多次使用给定的捕获组时,您将获得多次捕获。

将它与第一个正则表达式进行对比:

(data\[(?<row>\d{1,2})]\[(?<col>\d{1,2})]="(?<val>.*?)";)

让我们来看看比赛:

START;data[0][1]="2000";data[0][2]="2015-09-25";data[0][3]="XYZ";END;
           R  C   VVVV       R  C   VVVVVVVVVV       R  C   VVV        <-- groups
      \________________/\______________________/\_______________/      <-- whole matches

每个匹配对每个捕获组只有一个捕获实例。