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

String 检查字符串是否包含子字符串,string,perl,string-matching,String,Perl,String Matching,如何使用Perl检查给定字符串是否包含某个子字符串 更具体地说,我想查看给定字符串变量中是否存在s1.domain.com。要了解字符串是否包含子字符串,可以使用以下函数: if (index($str, $substr) != -1) { print "$str contains $substr\n"; } 它将返回$str中第一次出现的$substr的位置,如果未找到子字符串,则返回-1。另一种可能是使用Perl的著名功能: if ($mystring =~ /s1\.domai

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


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

要了解字符串是否包含子字符串,可以使用以下函数:

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

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

另一种可能是使用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);
}
或者,您可以按照说明操作并使用该函数。 警告一句:索引在找不到匹配项时返回
-1
,而不是
undef
0

因此,这是一个错误:

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

如果
s1.domain.com
位于字符串的开头,则这将是错误的。我个人已经不止一次被烧掉了。

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

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

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

当您使用变量进行搜索时,这种方法尤其可取-这种方法不必使用双转义字符(在此变量字符串中),这是正则表达式的专用字符(如
)。请参见此方法-我想
索引()
在简单的情况下比regexp快?一个关于以下问题的perl尝试性回答-我没有比较速度,但
=~
索引()
~
,所有这些似乎都有点
awk
-ward…:-\您还必须确保要比较的字符串不区分大小写。S1.DOMAIN.COM将不适用于子字符串。但是如果你使用lc($givendomain),然后将其与“s1.domain.com”进行比较,那么就可以了。此外,子字符串不一定是正确的方法-请参阅我上面对eugene y的注释response@DavidW.不知何故,我无法使用上面的正则表达式使
domain.com
subdomain.domain.com
匹配,有什么想法吗?请注意,对于不区分大小写的比较,建议使用
lc