2011-09-02 244 views

回答

179

要找出一个字符串包含的子字符串您可以使用index功能:

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

它将返回的$substr中第一次出现的位置$str,或-1,如果没有找到子。

+5

这种方式是特别preferrable,当你使用一个变量进行搜索 - 这样你就不必对双字符转义(在这个变量字符串中),这对于正则表达式来说是特殊的(比如':')。 – evgeny9

49

另一种可能性是使用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是在你的字符串的开头。我已经不止一次地被烧毁了。

+0

我想在简单情况下'index()'比regexps更快? –

+1

尝试perl回答有关[删除子字符串]的问题(http://stackoverflow.com/a/35593275/2019415) - 我没有比较速度,但'=〜','index()','~~'和['match :: simple'](https://metacpan.org/pod/match::simple)都显得有点'awk'-ward ...: - \ –

+0

您还必须确保字符串你正在比较不区分大小写。 S1.DOMAIN.COM不适用于子字符串。但是如果你使用lc($ givendomain),然后将其与“s1.domain.com”进行比较,那么这将起作用。此外,子字符串不一定是正确的方法 - 请参阅我上面的注释到eugene y的回应 – BlueChips23

11

不区分大小写的子串例

这是尤金的答案,其将字符串检查字串前面为小写的扩展:

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