Php 正则表达式反向引用

Php 正则表达式反向引用,php,regex,pcre,backreference,Php,Regex,Pcre,Backreference,具有以下正则表达式: ([a-z])([0-9])\1 它匹配a5a,有没有办法也匹配a5b、a5c、a5d等等 编辑:好的,我知道我可以只使用([a-z])([0-9])([a-z]),但我有一个非常长且复杂的正则表达式(匹配子域或匹配IPv4地址),这将真正受益于上述行为。这是否可能通过反向引用或其他方式实现 这是我需要的,但它似乎是错误的。如果第二个字母独立于第一个字母,你不需要反向引用,对吗 ([a-z])([0-9])([a-z])+ 编辑 如果您只是不想重复最后一部分,那么:

具有以下正则表达式:

([a-z])([0-9])\1
它匹配
a5a
,有没有办法也匹配
a5b
a5c
a5d
等等


编辑:好的,我知道我可以只使用
([a-z])([0-9])([a-z])
,但我有一个非常长且复杂的正则表达式(匹配子域匹配IPv4地址),这将真正受益于上述行为。这是否可能通过反向引用或其他方式实现



这是我需要的,但它似乎是错误的。

如果第二个字母独立于第一个字母,你不需要反向引用,对吗

([a-z])([0-9])([a-z])+
编辑

如果您只是不想重复最后一部分,那么:

([a-z])([0-9])([a-z])

只是去掉“+”。

我不明白你的问题是什么

[a-z][0-9][a-z] Exactly 1
[a-z][0-9][a-z]? One or 0
[a-z][0-9][a-z]+ 1 or more
[a-z][0-9][a-z]* 0 or more

正则表达式中的反向引用的全部要点是与指定的子表达式匹配相同的内容,因此无法禁用该行为

为了获得您想要的行为,即以后能够重用正则表达式的一部分,您可以在单独的字符串中定义要重用的正则表达式的部分,并且(取决于您使用的语言)使用字符串插值或串联从片段构建正则表达式

例如,在Ruby中:

>> letter = '([a-z])'
=> "([a-z])"
>> /#{letter}([0-9])#{letter}+/ =~ "a5b"
=> 0
>> /#{letter}([0-9])#{letter}+/ =~ "a51"
=> nil
或在JavaScript中:

var letter = '([a-z])';
var re = new RegExp(letter + '([0-9])' + letter + '+');
"a5b".match(re)

我怀疑您需要类似于Perl
(?PARNO)
构造的东西(它不仅仅用于递归;)


将匹配您想要的内容-对第一个捕获组的任何更改都将反映在
(?1)
匹配的内容中。

答案是不带反向引用

反向引用意味着匹配先前匹配的值。这并不意味着与前面的表达式匹配。但是,如果您的语言允许,您可以在编译之前将字符串中的变量替换为表达式

Tcl:

set exp1 "([a-z])"
regexp "${exp1}([0-9])${exp1}+" $string
var exp1 = '([a-z])';
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+');
string.match(regexp);
my $exp1 = '([a-z])';
$string =~ /${exp1}([0-9])${exp1}+/;
Javascript:

set exp1 "([a-z])"
regexp "${exp1}([0-9])${exp1}+" $string
var exp1 = '([a-z])';
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+');
string.match(regexp);
my $exp1 = '([a-z])';
$string =~ /${exp1}([0-9])${exp1}+/;
Perl:

set exp1 "([a-z])"
regexp "${exp1}([0-9])${exp1}+" $string
var exp1 = '([a-z])';
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+');
string.match(regexp);
my $exp1 = '([a-z])';
$string =~ /${exp1}([0-9])${exp1}+/;

反向引用用于从正则表达式的早期检索数据并在以后使用。它们不是用来解决风格问题的。有反向引用的正则表达式不能像没有反向引用的正则表达式一样工作。您可能只需要习惯正则表达式的重复性和丑陋性


也许可以试试Python,它可以很容易地从较小的块构建正则表达式。不清楚是否允许您更改您的环境…首先您很幸运有反向引用。

似乎是我要找的,但是您提供的regex在RegexBuddy(PCRE和Perl模式)中给了我错误。
(?1)
部分正则表达式在Perl模式下的RegexBuddy中给了我以下错误:错误字符(可能是不完整的正则表达式标记或未替换的元字符),无论如何,谢谢。=)那么我猜RegexBuddy不能处理Perl正则表达式的这个特性。在Perl中尝试一下,你会发现它是有效的。我不怀疑你,但我实际上需要这个正则表达式用于PHP项目尽管如此,知道这一点还是很好的。现在尝试一下,它也可以在我的PHP版本上运行。请在现实世界中尝试一下,而不仅仅是在RegexBuddy中尝试一下,然后再放弃它。不,我想体验一下您提供的第一个regex的效果
([a-z])([a-z])+
,但不必反复重复最后一部分。