具有以下正则表达式:
([a-z])([0-9])\1
匹配a5a
,是否有任何方法可以匹配a5b
,a5c
,a5d
等等?
编辑:好的,我知道我可以使用([a-z])([0-9])([a-z])
,但我有一个非常漫长而复杂的正则表达式(匹配子子子...真正受益于上述行为的.-域或匹配IPv4地址)。是否有可能通过反向引用或其他任何方式实现?
Anon. answer是我需要的,但似乎是错误的。
答案 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,这样可以轻松地从较小的块构建正则表达式。不清楚你是否被允许改变你的环境......你很幸运能够首先得到反馈。