查找字符串中的子字符串,忽略perl中的空格

时间:2014-04-15 09:35:00

标签: regex perl substring string-matching

String 1: quick brown fox jumps over a lazy dog

String 2: jumps over a lazy

我会将这些字符串传递给一个返回布尔值的子程序。

我现在的解决方案是从字符串和模式匹配中删除空格。

是否有更好的解决方案。

4 个答案:

答案 0 :(得分:4)

诀窍是规范化输入,以便进行直接比较。在这里,我们可以用一个空格替换所有空白字符序列。

sub fuzzy_contains {
    my ($haystack, $needle) = @_;
    # fold the spaces
    s/\s+/ /g for $haystack, $needle;
    return -1 < index $haystack, $needle;
}

您可能希望应用进一步的规范化,例如对字符串进行大小写折叠以进行大小写无关匹配(使用Unicode::CaseFoldfeature '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);
...