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

Regex with fixed start and end and repetitive groups inside

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;

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

让我们举个例子:

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次。 Rrow组捕获的值,Ccol捕获的值,VVVval捕获的值。

在这种情况下,大多数其他正则表达式引擎会丢弃除最后一次捕获之外的所有内容,并且您只能从您的 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

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