regex - 匹配双引号、多个捕获组之间的所有内容

标签 regex perl

我试图利用正则表达式来提取配置文件每一行双引号之间存在的信息。我对一些基本的正则表达式没问题,但是当涉及到复杂的正则表达式时;特别是涉及捕获组时,尽管我尝试通过 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/

相关文章:

perl - 如何从 perl 中删除 XML 中的特定元素

perl - 如何在 MooseX::Method::Signatures 方法中传递别名数组引用?

javascript - 获取已知格式的字符串的可变部分

ruby - 无休止的正则表达式 : Regex couldn't terminate while matching a 69 character String (killed after a week)

java - 在 Java 中屏蔽 XML 中敏感数据的性能优化方法

regex - 通过 Scala 中的正则表达式从字符串中提取元组

python - 用逗号分割字符串,除非在括号中

windows - 如何使用 xampp 在我的 Windows 8.1 中安装 koha....?

Perl:使父子例程(而不是方法)可供子例程使用的最佳方法

perl - 如何用Perl将指定格式的数据写入二进制文件?