2014-10-03 71 views
0

我有下面的代码Perl的正则表达式没有给出预期的结果

my $string = 'ban-3.1.2278-1.x86_64.1.rpm'; 
    my ($substr) = ($string =~ /(.+)-\d(.+)/); 
    print "Result: $substr\n"; 

我期待它返回禁令,但其返回的禁令,2278年3月1日,我不能弄明白为什么。 任何人都可以请解释为什么它的行为方式和最新的正确方法吗?

谢谢。

+0

您可以['切片'](http://perldoc.perl.org/perldata.html#Slices)它。例如'my $ string =(split/- /,'ban-3.1.2278-1.x86_64.1.rpm')[0];' – chrsblck 2014-10-03 05:43:39

回答

1

您需要+后作出.+第一个捕获组非贪婪内加入一个量词?这样它会做一个不情愿的匹配(即,最短的匹配)或否则会做一个最长匹配。

(.+?)-\d(.+) 

代码:

my $string = 'ban-3.1.2278-1.x86_64.1.rpm'; 
my ($substr) = ($string =~ /(.+?)-\d(.+)/); 
print "Result: $substr\n"; 

输出:

Result: ban 
2

因为任何字符.将匹配破折号。

如果你想限制他匹配,使用字符类或非贪婪匹配.*?

my $string = 'ban-3.1.2278-1.x86_64.1.rpm'; 
my ($substr) = $string =~ /([^-]*)-\d(.+)/; 
print "Result: $substr\n"; 

输出:

Result: ban 
0

在上面的代码“我($ SUBSTR)= ($ string =〜/(.+?)-\d(.+)/);“,使用不必要的分组。使用下面的代码而不是那个,

my $string = 'ban-3.1.2278-1.x86_64.1.rpm'; 
$string =~ /([a-z]+)-/i; 
print "Result: $1"; 

如果您只需要一个答案“禁令”是指使用此代码。

[a-z] + - 它匹配多个连续字母字符(准确匹配)。

i - 它用于区分大小写。

$ 1 - 它返回第一个分组的值。

输出

Result: ban 
1

拆分也给你所期望的。尝试这种

my $string = 'ban-3.1.2278-1.x86_64.1.rpm'; 
my @substr = split('-',$string); 
print "Result: $substr[0]\n"; 

输出

Result: ban 

该脚本由-的是存储到阵列分开。然后通过使用索引键值打印禁令,如$substr[0]

相关问题