0

我有这个文本$line = "config.txt.1",我想将它与正则表达式匹配并提取它的数字部分。我正在使用两个版本:

$line = "config.txt.1";

(my $result) = $line =~ /(\d*).*/;    #ver 1, matched, but returns nothing

(my $result) = $line =~ /(\d).*/;     #ver 2, matched, returns 1

(my $result) = $line =~ /(\d+).*/;    #ver 3, matched, returns 1

我认为这*有点搞砸了,我一直在看这个,但仍然没有正则表达式引擎中的贪婪机制。如果我从正则表达式的左侧开始,并且文本中可能没有数字,那么对于版本 1,它也会匹配。但是对于版本 3,它将不匹配。有人可以解释一下为什么会这样以及我应该如何写我想要的东西吗?(可能带有数字,不一定是单个数字)

编辑

要求:可能带有数字,不一定是单个数字,并且匹配不能捕获任何内容,但不应失败

输出必须如下(对于上面的示例):

config.txt 1

4

5 回答 5

2

正则表达式/(\d*).*/总是立即匹配,因为它可以匹配零个字符。它转换为在该位置匹配尽可能多的数字(零个或多个)。然后,匹配尽可能多的非换行符。好吧,比赛开始看cconfig。好的,它匹配零位数字。

你可能想使用一个正则表达式——它匹配句点和字符串结尾/\.(\d+)$/之间的整数。.

于 2013-08-29T10:22:55.253 回答
2

使用文字“。” 作为数字前匹配的参考:

   #!/usr/bin/perl 
    use strict;
    use warnings;

my @line = qw(config.txt file.txt config.txt.1 config.foo.2 config.txt.23 differentname.fsdfsdsdfasd.2444);

my (@capture1, @capture2);
foreach (@line){    
my (@filematch) = ($_ =~ /(\w+\.\w+)/); 
my (@numbermatch) = ($_ =~ /\w+\.\w+\.?(\d*)/);
my $numbermatch = $numbermatch[0] // $numbermatch[1];
    push @capture1, @filematch;
    push @capture2, @numbermatch;
}

print "$capture1[$_]\t$capture2[$_]\n" for 0 .. $#capture1;

输出:

config.txt  
file.txt    
config.txt  1
config.foo  2
config.txt  23
differentname.fsdfsdsdfasd  2444
于 2013-08-29T10:24:59.950 回答
1

.如果字符串不以数字结尾,要捕获最后的所有数字并且不使匹配失败,请使用/(?:\.(\d+))?$/

perl -E 'if ("abc.123" =~ /(?:\.(\d+))?$/) { say "matched $1" } else { say "match failed" }'
matched 123
perl -E 'if ("abc" =~ /(?:\.(\d+))?$/) { say "matched $1" } else { say "match failed" }'
matched
于 2013-08-29T11:34:30.080 回答
1

你根本不需要.*。这两个语句分配了完全相同的数字:

my ($match1) = $str =~ /(\d+).*/;
my ($match1) = $str =~ /(\d+)/;

默认情况下,正则表达式部分匹配,您不需要添加通配符。

您的第一次匹配没有捕获数字的原因是因为*也可以匹配零次。而且由于它不必与您的号码匹配,因此不需要。这就是为什么.*在那个正则表达式中实际上是有害的。除非某些东西是真正可选的,否则你应该使用它+

于 2013-08-29T10:23:58.537 回答
1

谢谢大家,我想我知道自己想要什么:

my ($match) = $line =~ /\.(\d+)?/;    #this will match and capture any digit 
                                      #number if there was one, and not fail
                                      #if there wasn't one
于 2013-08-29T10:41:03.920 回答