【问题标题】:Check whether a string contains a substring检查字符串是否包含子字符串
【发布时间】:2011-11-09 03:25:05
【问题描述】:

如何使用 Perl 检查给定字符串是否包含某个子字符串?

更具体地说,我想查看s1.domain.com 是否存在于给定的字符串变量中。

【问题讨论】:

    标签: string perl string-matching


    【解决方案1】:

    不区分大小写的子字符串示例

    这是 Eugene 答案的扩展,它在检查子字符串之前将字符串转换为小写:

    if (index(lc($str), lc($substr)) != -1) {
        print "$str contains $substr\n";
    } 
    

    【讨论】:

    • 请注意,对于不区分大小写的比较,建议使用 fc 而不是 lc
    【解决方案2】:

    要找出字符串是否包含子字符串,您可以使用index 函数:

    if (index($str, $substr) != -1) {
        print "$str contains $substr\n";
    } 
    

    它将返回$substr$str 中第一次出现的位置,如果未找到子字符串,则返回-1。

    【讨论】:

    • 这种方式尤其可取,当您使用变量进行搜索时 - 这样您就不必双重转义字符(在此变量字符串中),这对于正则表达式(如 @ 987654327@).
    【解决方案3】:

    另一种可能性是使用regular expressions,这是 Perl 的著名之处:

    if ($mystring =~ /s1\.domain\.com/) {
       print qq("$mystring" contains "s1.domain.com"\n);
    }
    

    需要反斜杠,因为. 可以匹配任何字符。您可以使用\Q\E 运算符来解决此问题。

    my $substring = "s1.domain.com";
        if ($mystring =~ /\Q$substring\E/) {
       print qq("$mystring" contains "$substring"\n);
    }
    

    或者,您可以按照eugene y 的说明使用index 函数。 只是一个警告:索引在找不到匹配项时返回 -1,而不是 undef0

    因此,这是一个错误:

    my $substring = "s1.domain.com";
    if (not index($mystring, $substr)) {
        print qq("$mystring" doesn't contains "$substring"\n";
    } 
    

    如果s1.domain.com 位于字符串的开头,这将是错误的。我个人不止一次为此感到痛苦。

    【讨论】:

    • 我想index() 在简单情况下比正则表达式更快?
    • 对关于 removing substrings 的问题的尝试 perl 回答 - 我没有比较速度,但 =~index()~~match::simple 似乎都有点 awk-ward ... :-\
    • 您还必须确保要比较的字符串不区分大小写。 S1.DOMAIN.COM 不适用于子字符串。但是,如果您使用 lc($givendomain),然后将其与“s1.domain.com”进行比较,那么就可以了。此外,子字符串不一定是正确的方法 - 请参阅上面我对 eugene y 的回应的注释
    • @David W. 不知何故,我无法使用上面的正则表达式让domain.com 匹配subdomain.domain.com,有什么想法吗?
    猜你喜欢
    • 2013-05-18
    • 2021-12-20
    • 2014-11-22
    • 2013-02-05
    • 1970-01-01
    • 2021-12-14
    • 2013-03-04
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多