无论perl中的空格如何,都匹配两个字符串

时间:2014-11-10 13:55:38

标签: regex perl

给定两个变量,如果不考虑空格,我怎么能匹配两个字符串?

my $String_1 = "FOO BAR";
my $String_2 = "FOOBAR";

if ($String_1 =~ m/ WHAT GOES HERE? /) {
    print "Match\n";
}

5 个答案:

答案 0 :(得分:2)

您可以从两个字符串中删除所有空格并检查它们是否相等。

my $String_1 = "FOO BAR";
my $String_2 = "FOOBAR";
my $temp1 = $String_1;
my $temp2 = $String_2;
$temp1 =~ s/\s+//g;
$temp2 =~ s/\s+//g;

if ($temp1 eq $temp2) {
    print "Match\n";
} else {
    print "No match\n";
}

在这里,我将它们分配给临时变量以保留原始字符串中的空格,但您不必这样做。


编辑:这是一种只使用一个临时变量的方法。正则表达式标志/x表示忽略空格。但是,您仍然需要一个临时变量来从其他字符串中删除空格。

my $String_1 = "FOO BAR";
my $String_2 = "FOO BAR";
my $temp = $String_2;
$temp =~ s/\s+//g;
if ( $temp =~ m/^$String_1$/x) {
    print "Match\n";
} else {
    print "No match\n";
}

答案 1 :(得分:1)

不使用变量的替代单行将是

print "match\n" if join("", split(/\s+/, $String_1) ) eq join("", split(/\s+/, $String_2) );

或者,如果你想看不到匹配的匹配

my $match = join("", split(/\s+/, $String_1) ) eq join("", split(/\s+/, $String_2) );
print $match ? "match\n" : "no match\n";

答案 2 :(得分:1)

使用翻译运算符和非破坏性选项tr///r可以很好地完成此操作。

该程序将比较封装在子程序no_space_compare中。

use strict;
use warnings;
use 5.014;     # For non-destructive translate

my $string_1 = "FOO BAR";
my $string_2 = "FOOBAR";

say $string_1 eq $string_2 ? 'match' : 'no match';

say no_space_compare($string_1, $string_2) ? 'match' : 'no match';

sub no_space_compare {
  my ($s1, $s2) = @_;
  $s1 =~ tr/ //dr eq $s2 =~ tr/ //dr;
}

<强>输出

no match
match

答案 3 :(得分:0)

您可以删除仅用于测试的空白:

#!/usr/bin/perl

use strict ;
use warnings ;

my $string_a = 'F  O O BA   R' ;
my $string_b = ' F O     O  B    A  R        ' ;

if( ( $string_a =~ s! !!gr ) eq ( $string_b =~ s! !!gr ) ) {
  printf "Yes, '%s' and '%s' are equal.\n" , $string_a , $string_b ;
}

这将打印:

Yes, 'F O O BA R' and ' F O O B A R ' are equal.

正则表达式的r修饰符返回修改后的字符串。

答案 4 :(得分:0)

在一行中:

use 5.010;
use strict;
my @str = ("F OO BA     R", " FO OB   AR");

print (($str[0] =~ s/\s*//gr eq $str[1] =~ s/\s*//gr)?'Match':'No Match');