String 1: quick brown fox jumps over a lazy dog
String 2: jumps over a lazy
我会将这些字符串传递给一个返回布尔值的子程序。
我现在的解决方案是从字符串和模式匹配中删除空格。
是否有更好的解决方案。
答案 0 :(得分:4)
诀窍是规范化输入,以便进行直接比较。在这里,我们可以用一个空格替换所有空白字符序列。
sub fuzzy_contains {
my ($haystack, $needle) = @_;
# fold the spaces
s/\s+/ /g for $haystack, $needle;
return -1 < index $haystack, $needle;
}
您可能希望应用进一步的规范化,例如对字符串进行大小写折叠以进行大小写无关匹配(使用Unicode::CaseFold或feature 'fc'
中的fc
)。
答案 1 :(得分:1)
我会建议这种方法:
在使用此搜索的针字符串中并替换:
's/ +/ .*?/g'
这基本上用.*?
替换每个空格(空格后跟0或更多任何字符),这将给你:
jumps .*?over .*?a .*?lazy
然后你可以在字符串数据和针之间进行正则表达式匹配。
答案 2 :(得分:1)
删除空格将匹配
ju lamps y la y y
在
快速的棕色狐狸跳过一只懒狗
但我认为,这不是你想要的。因此,在尝试匹配之前将空格转换为模式是个好主意:
sub substr_ignore_whitespace
{
my $string = shift;
my $sub_string = shift;
$sub_string =~ s/\s+/\\s+/g;
return $string =~ /$sub_string/;
}
答案 3 :(得分:0)
...
my $str1 = "quick brown fox jumps over a lazy dog";
$str1 =~ s|\s+||g;
my $substr = "jumps over a lazy";
$substr =~ s|\s+||g;
my $result = index($str1, $substr);
...