删除除字符串的特定部分之外的所

时间:2018-05-02 20:57:41

标签: regex perl

我有一个以版本号结尾的字符串,可能有两个或三个版本部分。

SOMEPREFIX10.1.1

SOMEPREFIX11.2

我想以通用的方式删除版本号的前缀。

我可以做这样的事情

$result =~ s/SOMEPREFIX//

这样可行,但如果SOMEPREFIX更改我需要修改正则表达式模式。

如何删除除版本号以外的所有内容(我猜(\d+\.(\d.)?\d)?)

4 个答案:

答案 0 :(得分:0)

你的问题非常不精确,但听起来你只需要捕捉字符串末尾的所有小数位和点

if ( my ($version) = /([\d.]+)$/ ) {

    # use $version
}

答案 1 :(得分:0)

假设您的字符串仅以字母开头并以版本号结尾,则以下脚本适合您。

以下脚本适用于以下字符串

SOMEPREFIX10.1.1 
SOMEPREFIXajdgcjhadjh134.1.1 
SOMEPREFIX11.2 
SOMEPREFIXajdgcjhadjh134.1.1.657.34.5

脚本:

#!/usr/bin/perl

my @reg=qw(SOMEPREFIX10.1.1 SOMEPREFIXajdgcjhadjh134.1.1 SOMEPREFIX11.2 SOMEPREFIXajdgcjhadjh134.1.1.657.34.5);

foreach (@reg)
{
        $_=~ /([a-zA-Z]+)(.*)/;

        print "$2\n";
}

输出:

10.1.1
134.1.1
11.2
134.1.1.657.34.5

答案 2 :(得分:0)

您想在字符串的末尾匹配两个或三个八位位组数字,如果得到它们,请删除字符串中的所有其他内容?

对。

s/.*?(\d+(?:\.\d+){1,2})$/$1/

我知道您知道何时以及如何使用=~运算符。

答案 3 :(得分:-1)

如果SOMEPREFIX包含一些数字,你可以匹配,直到数字和点的第一个组合没有匹配,你可以使用正向前瞻:

my $result = 'SOME3PREFIX11.1.0';
$result =~  s/^.*?(?=(\d+\.))//;

print $result;

__DATA__
11.1.0