我有下面的代码Perl的正则表达式没有给出预期的结果
my $string = 'ban-3.1.2278-1.x86_64.1.rpm';
my ($substr) = ($string =~ /(.+)-\d(.+)/);
print "Result: $substr\n";
我期待它返回禁令,但其返回的禁令,2278年3月1日,我不能弄明白为什么。 任何人都可以请解释为什么它的行为方式和最新的正确方法吗?
谢谢。
我有下面的代码Perl的正则表达式没有给出预期的结果
my $string = 'ban-3.1.2278-1.x86_64.1.rpm';
my ($substr) = ($string =~ /(.+)-\d(.+)/);
print "Result: $substr\n";
我期待它返回禁令,但其返回的禁令,2278年3月1日,我不能弄明白为什么。 任何人都可以请解释为什么它的行为方式和最新的正确方法吗?
谢谢。
您需要+
后作出.+
第一个捕获组非贪婪内加入一个量词?
这样它会做一个不情愿的匹配(即,最短的匹配)或否则会做一个最长匹配。
(.+?)-\d(.+)
代码:
my $string = 'ban-3.1.2278-1.x86_64.1.rpm';
my ($substr) = ($string =~ /(.+?)-\d(.+)/);
print "Result: $substr\n";
输出:
Result: ban
因为任何字符.
将匹配破折号。
如果你想限制他匹配,使用字符类或非贪婪匹配.*?
:
my $string = 'ban-3.1.2278-1.x86_64.1.rpm';
my ($substr) = $string =~ /([^-]*)-\d(.+)/;
print "Result: $substr\n";
输出:
Result: ban
在上面的代码“我($ 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
拆分也给你所期望的。尝试这种
my $string = 'ban-3.1.2278-1.x86_64.1.rpm';
my @substr = split('-',$string);
print "Result: $substr[0]\n";
输出
Result: ban
该脚本由-
的是存储到阵列分开。然后通过使用索引键值打印禁令,如$substr[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