Perl比较没有数字的字符串

时间:2012-09-07 22:00:58

标签: perl

我有两个变量:

my $var1 = 'package-name-1.4';
my $var2 = 'package-name-1.5';

我要做的是将$ var1与$ var2进行比较,同时排除数字。

我已经在网上看过并试过Regex,但是我无法让它工作,我非常感谢你的帮助。

我的想法如下:

if (removeNumbers($var1) =~ removeNumbers($var2))

这样结果就像比较:package-name-和package-name-,从而评估为true。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

嗯,最简单的方法就是完全删除所有数字:

sub remove_numbers {
  my ($orig) = @_;
  $orig =~ s/\d+//g;
  return $orig;
}

但它有点幼稚:例如,some-package-1.4.1some-package-1.4不相等。最好也删除点,但前提是它们跟随数字(用作分隔符)。

  $orig =~ s/\d+[.]?//g;

甚至更多,也许在数字之前的第一个连字符也应该去(所以'package-name'和'package-name-1'(甚至'package-name-1.0-some-fancy-line'和'' package-name-some-fancy-line')将被视为相同:

  $orig =~ s/-?\d+[.]?//g;  

更新:然而,有不止一种方法可以做到这一点:

  $orig = substr $orig, 0, rindex $orig, '-';

如果所有字符串具有相同的格式(版本号始终位于字符串的末尾,始终跟随最后一个连字符,始终存在),则适用:

使用如下:

if (remove_numbers($var1) eq remove_numbers($var2))

答案 1 :(得分:3)

在这种情况下,最好只提取所有“单词”(这里是指字母字符串)并比较仅包含那些

的字符串。

例如

sub words_only {
  join ' ', shift =~ /\b[a-z]+\b/ig;
}

会将package-name-1.4package-name-1.5都转换为package name,因此此脚本会正确打印MATCH

use strict;
use warnings;

my $var1 = 'package-name-1.4';
my $var2 = 'package-name-1.5';

print words_only($var1) eq words_only($var2) ? 'MATCH' : 'NO MATCH';

sub words_only {
  join ' ', shift =~ /\b[a-z]+\b/ig;
}

答案 2 :(得分:0)

如果您的变量包含相同的格式,那么您可以尝试删除字符串中的数字并比较结果。

相关问题