RegEx反向引用

时间:2010-01-14 01:57:14

标签: php regex pcre backreference

具有以下正则表达式:

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

匹配a5a,是否有任何方法可以匹配a5ba5ca5d等等?


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


Anon. answer是我需要的,但似乎是错误的。

6 个答案:

答案 0 :(得分:3)

答案是没有反向引用

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

<强>的Tcl:

set exp1 "([a-z])"
regexp "${exp1}([0-9])${exp1}+" $string

<强>使用Javascript:

var exp1 = '([a-z])';
var regexp = new RegExp(exp1 + '([0-9])' + exp1 + '+');
string.match(regexp);

<强>的Perl:

my $exp1 = '([a-z])';
$string =~ /${exp1}([0-9])${exp1}+/;

答案 1 :(得分:2)

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

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

修改

如果您不想一遍又一遍地重复最后一部分,那么:

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

只是拿走'+'。

答案 2 :(得分:2)

正则表达式中反向引用的重点是匹配与指示的子表达式相同的东西,因此无法禁用该行为。

要获得所需的行为,以后能够重用正则表达式的一部分,您可以在单独的字符串中定义要重用的正则表达式的部分,并且(取决于您的语言)重新工作)使用字符串插值或连接来从片段构建正则表达式。

例如,在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)

答案 3 :(得分:1)

我怀疑你想要类似于Perl (?PARNO)构造的东西(它不只是用于递归;)。

/([a-z])([0-9])(?1)+/

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

答案 4 :(得分:0)

我没有关注你的问题?

[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

答案 5 :(得分:0)

反向引用用于从正则表达式中的较早版本检索数据并在以后使用它。它们不是用于修复风格问题。具有反向引用的正则表达式将不起作用。你可能只需要习惯重复和丑陋的正则表达式。

也许尝试使用Python,这样可以轻松地从较小的块构建正则表达式。不清楚你是否被允许改变你的环境......你很幸运能够首先得到反馈。