【问题标题】:Is there a Perl equivalent for Ruby's Regexp.names?Ruby 的 Regexp.names 是否有 Perl 等价物?
【发布时间】:2018-03-28 11:50:28
【问题描述】:

在 Ruby 中,您可以使用 namesmethod 提取正则表达式的命名捕获组:

/(?<foo>.)(?<bar>.)(?<baz>.)/.names
#=> ["foo", "bar", "baz"]

这种方法有 Perl 等价物吗?我可以像这样提取名称:

while ( $re =~ m/\?<(.+?)>/g ) {
    say $1;
}

但我不知道该解决方案有多强大/高效/优雅。

已编辑:我知道您可以在匹配后获取名称,但我需要在使用正则表达式之前提取名称。

【问题讨论】:

  • 我不明白 Ruby 的作用。您可以在 Perl 中命名捕获组。
  • 你需要的大概是keys %+

标签: regex perl capturing-group


【解决方案1】:

您可以在匹配成功后提取组的名称:

my $re = qr/(?<foo>.)(?<bar>.)(?<baz>.)/;
'abc' =~ $re;
say for keys %-;

另见Tie::Hash::NamedCapture

【讨论】:

  • 等等,不是%+吗?
  • 哦。 perlvar 有区别。
  • 我需要提取名称而不必匹配正则表达式
  • @abjY6U54:如果您认为您需要知道尚未应用于字符串的正则表达式模式中的捕获组的名称,那么您需要再考虑一下。这是在 Perl 中无法完成的事情,而且有充分的理由。只有在当前词法范围内 成功 匹配后,这些值才可用。
【解决方案2】:

PPIx::Regexp::capture_names:

foreach my $name ( $re->capture_names() ) {
      print "Capture name '$name'\n";
 }

此便捷方法返回在正则表达式中找到的捕获名称。

我没有尝试过这个模块,所以我不确定它是否是一种 100% 可靠的方式来提取你想要的信息。

另请参阅@ikegami 对this question 的回答,这使我重新阅读了perldoc re

regnames($all)

返回上一个定义的所有命名缓冲区的列表 匹配成功。如果$all 为真,则返回所有定义的名称, 如果不是,则仅返回匹配中涉及的名称。

如此接近,但并不完全。我不知道像 Ruby 的 .names 那样在 Perl 中对正则表达式模式进行内省的内置方法。

【讨论】:

  • 谢谢!那就是我一直在寻找的。​​span>
  • 请注意,这需要将正则表达式模式单独解析为 PPIx::Regexp 对象。它不适用于普通编译的 Perl 正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2014-03-08
  • 1970-01-01
  • 2012-05-20
  • 2016-06-12
相关资源
最近更新 更多