【问题标题】:Find substring within a string ignoring white spaces in perl在忽略perl中的空格的字符串中查找子字符串
【发布时间】:2014-05-29 13:52:36
【问题描述】:

String 1: quick brown fox jumps over a lazy dog

String 2: jumps over a lazy

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

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

有没有更好的解决方案。

【问题讨论】:

  • 删除空格并使用 index()
  • 你也可以搜索quick jumps lazy吗?

标签: regex perl substring string-matching


【解决方案1】:

我会建议这种方法:

在针串中使用此搜索替换:

's/ +/ .*?/g'

这基本上是用.*?(空格后跟0个或更多任何字符)替换每个空格,这会给你:

jumps .*?over .*?a .*?lazy

然后你可以在你的字符串数据和针之间进行正则表达式匹配。

【讨论】:

  • 酷,这比我要求的要多,它可以跨词匹配。
  • 是的,这就是我在评论中提出这个问题的原因,因为我的回答是为了匹配单词。
【解决方案2】:

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

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)。

【讨论】:

  • 不知道折叠,谢谢
【解决方案3】:
...
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);
...

【讨论】:

    【解决方案4】:

    删除空格会匹配

    跳过一个懒人

    快速的棕狐跳过一只懒狗

    但我认为,这不是你想要的。因此,在尝试匹配之前将空格转换为模式是个好主意:

    sub substr_ignore_whitespace
    {
        my $string      = shift;
        my $sub_string  = shift;
    
        $sub_string =~ s/\s+/\\s+/g;
    
        return $string =~ /$sub_string/;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-19
      • 2015-02-18
      • 2015-12-17
      • 2014-10-22
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多