给定两个变量,如果不考虑空格,我怎么能匹配两个字符串?
my $String_1 = "FOO BAR";
my $String_2 = "FOOBAR";
if ($String_1 =~ m/ WHAT GOES HERE? /) {
print "Match\n";
}
答案 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');