【问题标题】:Perl: How get multiple regex captures in a structured way?Perl:如何以结构化方式获取多个正则表达式捕获?
【发布时间】:2020-09-25 21:30:05
【问题描述】:

我试图在任意字符串中获取一组模式的所有出现,就像这样:

my $STRING = "I have a blue cat. That cat is nice, but also quite old. She is always bored.";

foreach (my @STOPS = $STRING =~ m/(?<FINAL_WORD>\w+)\.\s*(?<FIRST_WORD>\w+)/g ) {

  print Dumper \%+, \@STOPS;
}

但结果不是我所期望的,我也不完全明白为什么:

$VAR1 = {
          'FINAL_WORD' => 'old',
          'FIRST_WORD' => 'She'
        };
$VAR2 = [
          'cat',
          'That',
          'old',
          'She'
        ];
$VAR1 = {
          'FINAL_WORD' => 'old',
          'FIRST_WORD' => 'She'
        };
$VAR2 = [
          'cat',
          'That',
          'old',
          'She'
        ];
$VAR1 = {
          'FINAL_WORD' => 'old',
          'FIRST_WORD' => 'She'
        };
$VAR2 = [
          'cat',
          'That',
          'old',
          'She'
        ];
$VAR1 = {
          'FINAL_WORD' => 'old',
          'FIRST_WORD' => 'She'
        };
$VAR2 = [
          'cat',
          'That',
          'old',
          'She'
        ];

如果没有更好的解决方案,我可以接受 @STOPS 最后的内容并省略循环。但我更愿意单独获取每对匹配项,但我没有办法。

但是为什么循环会执行多次呢?

提前谢谢你,问候,

迷宫

【问题讨论】:

  • 结果如何?你期待什么?
  • 我没有发布完整的结果,因为它相当长。我应该这样做还是尝试描述结果?我的预期有点模糊,但上面记录了我正在寻找的内容:一种分别获取每个匹配对的方法,无论是在变量中还是在 $1$2 每次循环运行中的一对。
  • 字符串中只有三个句子不能太长。
  • 我现在添加了完整的输出。
  • 也许你想要一个while 循环来代替? (在标量上下文中完成匹配,而不是列表)

标签: regex perl regex-group


【解决方案1】:

您需要使用while 循环而不是for 循环:

while ($STRING =~ m/(?<FINAL_WORD>\w+)\.\s*(?<FIRST_WORD>\w+)/g ) {
    print Dumper \%+;
}

输出

$VAR1 = {
          'FIRST_WORD' => 'That',
          'FINAL_WORD' => 'cat'
        };
$VAR1 = {
          'FIRST_WORD' => 'She',
          'FINAL_WORD' => 'old'
        };

for 循环在@STOPS 中一次收集所有匹配项,%+ 设置为最后一个全局匹配项。 while 循环允许您分别遍历每个全局匹配。

根据perldoc perlretut

修饰符/g代表全局匹配,允许匹配 运算符在字符串中匹配尽可能多的次数。标量 在上下文中,对字符串的连续调用将有 /g 跳转 从匹配到匹配,跟踪字符串中的位置 随之而来。您可以通过pos() 函数获取或设置位置。

【讨论】:

  • 非常感谢。这现在看起来很明显,但我发现在网上某处使用了for 循环并且无法考虑它。但是还有一个问题:while 也使用数组上下文,就像之前的my @STOPS 一样。然而,这里我们得到一个循环迭代每个global match。我理解正确吗?
  • while 循环不使用数组上下文,而是使用标量上下文和g 修饰符来跟踪全局匹配。查看我的更新答案
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多