检查字符串是否包含子字符串


113

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

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

Answers:


231

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

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

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


6
当您使用变量进行搜索时,这种方式尤其可取-这样,您就不必对正则表达式(如:)特殊的字符(在此变量字符串中)进行两次转义。
evgeny9'2013-4-2

57

另一种可能性是使用正则表达式,这是Perl的著名之处:

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

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

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

或者,您可以按照eugene y进行操作并使用索引函数。只是警告-1一下:Index 找不到匹配项时会返回a ,而不是undefor 0

因此,这是一个错误:

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

如果s1.domain.com在字符串的开头,这将是错误的。我个人对此不止一次。


我想index()在简单的情况下比正则表达式快?
G. Cito

1
一个Perl的尝试回答一个问题关于删除子 -我没有比较速度,但=~index()~~match::simple一切似乎有点awk-ward ...: - \
G. CITO

您还必须确保要比较的字符串不区分大小写。S1.DOMAIN.COM不适用于子字符串。但是,如果您使用lc($ givendomain),然后将其与“ s1.domain.com”进行比较,则可以使用。另外,子字符串不一定是正确的方法-请参见上面我对尤金(Eugene y)的回应的注释
BlueChips23,2016年

@David W.不知何故我无法使用上面的REGEX domain.com匹配subdomain.domain.com任何想法?
avrono

14

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

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

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

1
请注意,fc建议不要将其lc用于不区分大小写的比较。
melpomene
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.