1

我目前正在运行。我正在尝试将 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”为后缀。

4

1 回答 1

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替换字符串,否则放入.0like this :'.0'

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

键盘演示

于 2013-09-14T15:22:21.747 回答