具有固定开始和结束以及内部重复组的正则表达式
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次。 R
是row
组捕获的值,C
是col
捕获的值,VVV
是val
捕获的值。
在这种情况下,大多数其他正则表达式引擎会丢弃除最后一次捕获之外的所有内容,并且您只能从您的 0
、3
和 XYZ
匹配。
但是 .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
每个匹配项对于每个捕获组只有一个捕获实例。
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次。 R
是row
组捕获的值,C
是col
捕获的值,VVV
是val
捕获的值。
在这种情况下,大多数其他正则表达式引擎会丢弃除最后一次捕获之外的所有内容,并且您只能从您的 0
、3
和 XYZ
匹配。
但是 .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
每个匹配项对于每个捕获组只有一个捕获实例。