Perl中的正则表达式未给出预期答案

时间:2015-07-23 07:59:01

标签: regex perl

我正在尝试在Perl中实现正则表达式。我的代码是

my $version=6.1; 
$version =~ /\d./;
print $version;

预期产出:

6.

6

当前输出:

6.1

我在regxpal和regxr中尝试了上面的方法,它给了我6.。但是,我得到6.1

我也尝试过:

$version =~ /\d\./;

它出了什么问题?

5 个答案:

答案 0 :(得分:3)

您也可以直接将$ 1的内容分配回$ version,如下所示:

my $version = 6.1;
( $version ) = $version =~ /(\d\.)/;
print $version;

如果您想要捕获多个组,也可以扩展它:

my ($main_version, $minor_version ) = $version =~ /(\d)\.(\d)/;

答案 1 :(得分:1)

只需捕获您对使用括号感兴趣的部分,然后将其分配给$1

my $version = 6.1;
$version =~ /(\d\.)/;
print $1;

输出:

6.

要覆盖原始变量,您可以使用以下内容:

my $version = 6.1;
if ($version =~ /(\d\.)/) {
    $version = $1;
}

如果模式匹配,这只会覆盖变量。

答案 2 :(得分:1)

要使正则表达式工作所需要做的就是使用$&反向引用,要匹配文字点,您需要将其转义或放入字符类:

print "$&";

请参阅IDEONE

my $version=6.1; 
$version =~ /\d\./;
print "$&";  # => 6.

请参阅perldoc.perl.org

  

即使正则表达式中没有分组,仍然可以找出字符串中完全匹配的内容。如果您使用它们,Perl会在匹配前将$`设置为字符串的一部分,将$&设置为匹配的字符串部分,并将$'设置为该部分匹配后的字符串。

答案 3 :(得分:0)

您可以修剪除\d\.

以外的所有字符
my $version = 6.1; 
$version =~ s/.*(\d\.).*/$1/;
print $version;

现在,它会打印6.。你在代码中做的是,你只做匹配。

IDEONE

仅获取点之前存在的数字。

$version =~ s/.*(\d)\..*/\1/;

答案 4 :(得分:0)

我想你想要的是删除数字字符串的任何小数部分

这样做

my $version = 6.1; 
$version =~ s/\..*//;
print $version, "\n";

输出

6