可以将一个RegEx组用于多个匹配吗?

时间:2018-10-06 21:14:25

标签: regex

示例文字:

[ABC[[value='123'SomeTextHere[]]][value='5463',SomedifferentTextwithdifferentlength]][[value='Text';]]]]][ABC [...]

当前RegEx:

[ABC.*?(?:value='(.*?)')+.*?]]]

我想实现的目标:

有一个非常长的文本(HTTP响应),其中包含我要获取的数据。单个数据集包含多行。我想收集的每一行数据都位于“ value:”标记内。每行上都有多个这些值标签。是否可以使用(优化)上述正则表达式以仅在正则表达式模式中具有单个捕获组的方式获取所有值标签的数据?

要弄清楚我想要什么:或者,我将不得不使用以下模式:

[ABC.*?value='(.*?)'.*?value='(.*?)'.*?value='(.*?)'.*?value='(.*?)'.*?]]]

1 个答案:

答案 0 :(得分:0)

使用Perl,您可以轻松获得正则表达式的所有匹配项,并且其他大多数正则表达式库都具有类似的功能。如要匹配标题,最简单的方法是使用锚点(\G进行重复匹配:

use strict;
#use Regexp::Debugger;
my $data = "[ABC[[value='123'SomeTextHere[]]][value='5463',SomedifferentTextwithdifferentlength]][[value='Text';]]]]][ABC [...]";
my @matches = $data =~ /(?:^\[ABC|\G).*?\bvalue='([^']*)'/g;
print "[$_]" for @matches;

__END__
[123][5463][Text]

您很有可能需要将“ global”标志添加到用于匹配的任何正则表达式库中。

就个人而言,我将其分为两个步骤。首先,提取[ABC[[]]]之间的字符串,然后从该字符串中提取所有value='...'部分。同样,最有可能的是,您可以以理智的方式解析字符串[ABC[[...]]],计算左括号和右括号。还是那个字符串甚至是JSON,您就可以在那里使用适当的解析器?