繁体   English   中英

RegEx反向引用

[英]RegEx Backreferences

具有以下正则表达式:

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

它匹配a5a ,有没有什么办法让它也匹配a5ba5ca5d等等?


编辑:好的,我明白我可以使用([az])([0-9])([az])但我有一个非常长而复杂的正则表达式(匹配sub-sub-sub -... -domains匹配IPv4地址 ),这将真正受益于上述行为。 以某种方式可以通过反向引用或其他任何方式实现吗?


匿名。 答案是我需要的,但似乎是错误的。

答案不是反向引用

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

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}+/;

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

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

编辑

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

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

只是拿走'+'。

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

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

例如,在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)构造(它不仅仅用于递归;)。

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

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

我不关注你的问题?

[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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM