我试图利用正则表达式来提取配置文件每一行双引号之间存在的信息。我对一些基本的正则表达式没问题,但是当涉及到复杂的正则表达式时;特别是涉及捕获组时,尽管我尝试通过 regex101.com 进行测试和研究,但我仍然遇到困难。 .
my $text = '
"Key1" = { StuffIDontCareAbout = "Value1" },
"Key2" = { StuffIDontCareAbout = "Value2" },
"Key3" = { StuffIDontCareAbout = "Value3" },
"Key4" = { StuffIDontCareAbout = "Value4" },';
my %hash = undef;
for (split/\n/,$text) {
my $pattern = qr/(")(?:(?=\\?))\2.)*?\1/;
$hash{$1} = $2 if (/$pattern/);
}
print Dumper \%hash;
关于regex101.com我关心的信息突出显示;然而在我的 Perl 脚本中 $1 = "& $2 = null.
我认为我需要将引号与非捕获组匹配,以便第一个和第二个捕获组是它们之间的所有内容,但我无法弄清楚。
提前致谢。
最佳答案
如果永远不能嵌套引号,永远,那么您可以匹配引号之间的非引号字符序列,并“全局”执行此操作(/g
修饰符),因此字符串中的所有此类实例。一种方法
my %hash;
foreach my $line (split /\n/, $text) {
if (my ($key, $value) = $line =~ /"([^"]+)"/g) {
$hash{$key} = $value;
}
}
还有许多其他方法可以检查您是否有两个(准确地说是两个?)匹配项,并组织其余的处理。†
请注意,声明变量时不需要将 undef
赋值给该变量,并且它不会执行任何操作;一个新的 my
变量(未分配)是 undef
。
使用 $text
测试的所有代码均从问题中逐字复制。
†出于好奇,可以在一行中完成所有操作
my %hash = map { /"([^"]+)"/g } split /\n/, $text;
这不是一个好的做法,因为我们无法一路检查任何内容。
关于regex - 匹配双引号、多个捕获组之间的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66169481/