【发布时间】:2021-02-12 18:45:45
【问题描述】:
我正在尝试利用正则表达式来提取配置文件每一行中双引号之间存在的信息。我对一些基本级别的正则表达式没意见,但是当涉及到复杂的正则表达式时;尤其是涉及捕获组,尽管我尝试通过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.
我认为我需要将引号与非捕获组匹配,以便第一个和第二个捕获组是它们之间的所有内容,但我无法弄清楚。
提前致谢。
【问题讨论】:
-
可以(ever)嵌套引号吗? “像‘这个’案子?”如果没有,那么你可以匹配:一个引号,任意数量的非引号字符(捕获它),然后引用 -- 重复。喜欢:
/"([^"]+)"/g -
@anubhava 我希望 perl %hash 填充有 Key1 = Value1 等。似乎 perls $1 和 $2 变量返回捕获组而不是匹配项。
-
@zdim,我没有看到嵌套引号,配置文件似乎有标准语法。
-
好的,谢谢;我预计(发布答案)
-
@zdim 该正则表达式仅返回 1 个捕获组,因此它将填充 $hash{$1} 变量,而不是 = $2 变量。诀窍是在我认为的捕获组中引用匹配项。