我目前正在跑步。我试图将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”。
答案 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代码,因此.
是连接运算符。