Regex Perl正则表达式前向引用
我想将正向引用与regexp匹配。我正在寻找的模式是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";
[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