【问题标题】:Match everything between double quotes, multiple capture groups匹配双引号、多个捕获组之间的所有内容
【发布时间】: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 变量。诀窍是在我认为的捕获组中引用匹配项。

标签: regex perl


【解决方案1】:

如果从不可以嵌套引号,永远不会,那么您可以在引号之间匹配一系列非引号字符,并“全局”执行此操作(/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;

这不是一个好的做法,因为我们无法在此过程中检查任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多