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

Regex Perl中的正则表达式未给出预期答案,regex,perl,Regex,Perl,我试图用Perl实现一个正则表达式。我的代码是 my $version=6.1; $version =~ /\d./; print $version; 预期产出: 6. 或 电流输出: 6.1 我在regxpal和regxr中尝试了上述方法,它给出了6.。但是,我得到了6.1 我还尝试: $version =~ /\d\./; 怎么了 您可以修剪除\d\之外的所有字符。 my $version = 6.1; $version =~ s/.*(\d\.).*/$1/; print $v

我试图用Perl实现一个正则表达式。我的代码是

my $version=6.1; 
$version =~ /\d./;
print $version;
预期产出:

6.

电流输出:

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

我还尝试:

$version =~ /\d\./;

怎么了

您可以修剪除
\d\之外的所有字符。

my $version = 6.1; 
$version =~ s/.*(\d\.).*/$1/;
print $version;
现在,它将打印
6.
。您在代码中所做的是,只进行匹配

仅获取点之前存在的数字

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

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

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

6.
要覆盖原始变量,可以执行以下操作:

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

这将仅在模式匹配时覆盖变量。

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

my $version = 6.1;
if ($version =~ /(\d\.)/) {
    $version = $1;
}
my $version = 6.1;
( $version ) = $version =~ /(\d\.)/;
print $version;
如果您还想捕获多个组,则可以扩展此功能:

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

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

print "$&";
见:

见:

即使regexp中没有分组,仍然可以找出字符串中完全匹配的内容。如果使用它们,Perl将对匹配前的字符串部分设置
$`
,对匹配的字符串部分设置
$&
,并对匹配后的字符串部分设置
$'


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

这样就可以了

my $version = 6.1; 
$version =~ s/\..*//;
print $version, "\n";
输出
好的,谢谢,应该是version=~s/*(\d.).*/$1/而不是\1。与原始任务相比,此解决方案效率非常低:只需匹配第一个数字和一个点,然后打印它们。请注意,您的原始代码是完全正确的,您只需要一个正确的反向引用。op提到他想匹配第一个数字的地方?@AvinashRaj(已更正)op的模式
/\d\。/
匹配后面跟一个点的第一个数字。你的不使它成为非贪婪的
s/*?(\d\)./$1/请注意,您不需要任何替换,也不需要设置会降低性能的捕获组(尽管对于这样一个简单的正则表达式,性能不是关键)。应该注意的是,您在那里所做的并没有改变任何东西,这是一个布尔测试。你没有用。
6