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;
但是这给了我一个输出,其中不同的组是独立的,而不是更大匹配的一部分。我坚持我应该尝试的东西。
答案 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
组捕获的值,C
是col
捕获的值,VVV
是val
捕获的值。 / p>
在这种情况下,大多数其他正则表达式引擎会丢弃除最后一次捕获之外的所有引擎,并且您只从匹配中获得值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
每个匹配对每个捕获组只有一个捕获实例。