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

Bel*_*ish 105 string perl string-matching

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

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

Eug*_*ash 221

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

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

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

  • 当你使用变量进行搜索时,这种方式特别适合 - 这样你就不必双重转义字符(在这个变量字符串中),这对于正则表达式来说是特殊的(比如`:`). (5认同)

Dav*_* W. 55

另一种可能性是使用Perl着名的正则表达式:

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

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

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

或者,你可以像eugene所说的那样做并使用索引函数.只是一句警告:-1当索引找不到匹配而不是undef或时,索引返回0.

因此,这是一个错误:

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

如果s1.domain.com在字符串的开头,这将是错误的.我个人不止一次被焚烧过.


Jam*_*vec 14

Case Insensitive Substring示例

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

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

  • 请注意,对于不区分大小写的比较,建议使用 [`fc`](https://perldoc.pl/functions/fc) 而不是 `lc`。 (2认同)