我正在尝试在Perl中实现正则表达式。我的代码是
my $version=6.1;
$version =~ /\d./;
print $version;
预期产出:
6.
或
6
当前输出:
6.1
我在regxpal和regxr中尝试了上面的方法,它给了我6.
。但是,我得到6.1
。
我也尝试过:
$version =~ /\d\./;
它出了什么问题?
答案 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.
。你在代码中做的是,你只做匹配。
仅获取点之前存在的数字。
$version =~ s/.*(\d)\..*/\1/;
答案 4 :(得分:0)
我想你想要的是删除数字字符串的任何小数部分
这样做
my $version = 6.1;
$version =~ s/\..*//;
print $version, "\n";
6