正则表达式匹配在不存在时添加字符

时间:2013-09-14 15:05:20

标签: regex

我目前正在跑步。我试图将2个正则表达式规则简化为单个规则,但看起来没有办法做到这一点。我目前正在学习,也许有些东西我错过了,也许有人可以帮助我。

2个正则表达式看起来像这样:

s@.*/(\d\.\d\.\d)/@Version: $1/@g
s@.*/(\d\.\d)/@Version: $1.0/@g

我正在尝试

s@.*/(\d\.\d)(\.\d)?(?(2)|\.0)/@Version $1$2$3/@g

但它不起作用。我理解条件错了吗? 有些版本号只有2位数,而我想要的后缀为“.0”。

1 个答案:

答案 0 :(得分:2)

你的正则表达式有一点问题:

s@.*/(\d\.\d)(\.\d)?(?(2)|\.0)/@Version $1$2$3/@g
                    ^^^^^^^^^^

我加下划线的部分由Perl解释:如果我在第2组中捕获了某些内容,则不执行任何操作,否则请尝试匹配点.后跟0

这不是您所期望的,换句话说,它不会在自己的一组中捕获.0

在Perl中,通过使用e正则表达式修饰符,可以在正则表达式的替换部分中执行Perl代码,从而完全满足我们的需要。

s/(\d\.\d)(\.\d)?/'@Version ' . $1 . ($2?$2:'.0')/ge;

这基本上表示,如果您能够匹配第2组$2?,则将$2放入替换字符串中,否则将.0添加为此:'.0'

Perl将替换字符串计算为Perl代码,因此.是连接运算符。

Codepad Demo