【问题标题】:How to get the expression of matching capture in Perl如何在Perl中获取匹配捕获的表达式
【发布时间】:2014-12-10 03:41:45
【问题描述】:

在 Perl 中,我如何获得在正则表达式中匹配的捕获表达式?

$s = 'aaazzz';
$s =~ s/(a+)|(b+)|(c+)/.../;
$s =~ s/(?<one>a+)|(?<two>b+)|(?<three>c+)/.../;

我指的是表达式(例如a+),而不是字符串aaa

我需要编号和命名捕获的表达式。

【问题讨论】:

  • 我认为没有办法自动执行此操作。你想做什么需要这个?
  • 我有一个带有许多管道的正则表达式。根据正则表达式匹配,我想在之后调用不同的 subs。
  • 你可以通过匹配是否在$1$2$3等来判断匹配的部分。
  • 我知道如何确定哪个捕获匹配(定义 $1),但要获得表达式,我必须分析整个正则表达式( (a+)|(b+)|(c+) )。是不是有一个特殊的变量来存储最后匹配的表达式?
  • 为什么需要获取表达式?你不知道你在正则表达式中放了什么吗?如果defined $1 则表达式为a+,如果defined $2 则表达式为b+,以此类推

标签: regex perl matching capture


【解决方案1】:

我会这样做:

use strict;
use warnings;

my @regexes = (
    qr/(a+)/,
    qr/(b+)/,
    qr/(c+)/,
);
my $string = 'aaazzz';
foreach my $re(@regexes) {
    if ($string =~ $re) {
        print "Used regex is $re\n";
    }
}

输出:

Used regex is (?^:(a+))

【讨论】:

【解决方案2】:

您可以从组件中组装您的正则表达式,然后测试哪些组匹配。出于演示目的,我只使用了 match 和 not match 以及替换运算符 's',但同样适用。

$s = 'aaazzz';
$part1 = '(a+)';
if ( $s =~ /$part1|(b+)|(c+)/ ) {

    if ($1) {
        print("$part1 matched\n");
    }
    else {
        print("$part1 did not match\n");
    }
}

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多