Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式前向引用_Regex_Perl_Reference - Fatal编程技术网

Regex Perl正则表达式前向引用

Regex Perl正则表达式前向引用,regex,perl,reference,Regex,Perl,Reference,我想将正向引用与regexp匹配。我正在寻找的模式是 [snake-case prefix]_[snake-case words] [same snake-case prefix]_number 例如: foo_bar_eighty_twelve foo_bar_8012 如果不先查看foo\u bar\u 8012,我无法提取foo\u bar和八十二。因此,我需要一个正向引用,而不是一个反向引用,只有当我的前缀不是snake-case前缀时才有效 my $prefix = "foo";

我想将正向引用与regexp匹配。我正在寻找的模式是

[snake-case prefix]_[snake-case words] [same snake-case prefix]_number
例如:

foo_bar_eighty_twelve foo_bar_8012
如果不先查看
foo\u bar\u 8012
,我无法提取
foo\u bar
八十二
。因此,我需要一个正向引用,而不是一个反向引用,只有当我的前缀不是snake-case前缀时才有效

my $prefix = "foo";
local $_ = "${prefix}_thirty_two = ${prefix}_32";

# Backward reference that works with a prefix with no underscores
{
    /(\w+)_(\w+) \s+ = \s+ \1_(\d+)/ix;
    print "Name: $2 \t Number: $3\n";
}

# Wanted Forward reference that do not work :(
{
    /\2_(\w+) \s+ = \s+ (\w+)_\d+/ix;
    print "Name: $1 \t Number: $2\n";
}
不幸的是,我的前瞻性参考不起作用,我不知道为什么。我读到Perl支持这种模式

有什么帮助吗

AFAIK不是一个允许交换捕获组和引用的魔弹

我已经看了很多例子,我只是不认为你能做你正在尝试的事情,使用正向引用

我通过使用反向引用和前瞻相结合的方法解决了这个问题。像这样:

/(?=.*=\s*([a-z]+))\1_(\w+) \s+ = \s+ \w+_\d+/ix
这是因为前瞻在“实际”表达式之前初始化第一个捕获组。供参考,本部分为前瞻:

(?=.*=\s*([a-z]+))

它基本上只是一种“亚正则表达式”。我之所以使用[a-z]+,是因为\w+包含下划线。我认为这不是你想要的。

以下假设是错误的:

“如果不先看一下foo_bar_8012,我就无法提取foo_bar和八十二。”

是的,在查看第二组字符之前,确实无法确定第一组字符中的插入前缀和名称出现在何处,但是正则表达式的功能就随之而来了。它在第一次传递时贪婪地匹配,发现第二个字符串不匹配,然后回溯,以较小的字符串作为前缀重试

下面演示了如何使用简单的反向引用来实现目标:

use strict;
use warnings;

while (<DATA>) {
    if (m{\b(\w+)_(\w+)\s+\1_(\d+)\b}) {
        print "Prefix = $1, Name = $2, Number = $3\n";
    } else {
        warn "Not found: $_"
    }
}
__DATA__
foo_thirty_two foo_32
foo_bar_eighty_twelve foo_bar_8012

我不明白为什么反向引用不起作用。我做了一个在我看来是正常的(它与前缀匹配)。在您的示例中,代码对我一字不差地工作(除了从
my$\ucode>中删除
my
)。我想你可能已经把问题匿名化了。有趣的是。。。看来你是对的,我把这个问题匿名了,很好的一点是卢卡斯让我发现了这一点,这太棒了!请记住,PRCE与Perl正则表达式引擎不同。
Prefix = foo, Name = thirty_two, Number = 32
Prefix = foo_bar, Name = eighty_twelve, Number = 8012