【发布时间】:2011-11-09 03:25:05
【问题描述】:
如何使用 Perl 检查给定字符串是否包含某个子字符串?
更具体地说,我想查看s1.domain.com 是否存在于给定的字符串变量中。
【问题讨论】:
标签: string perl string-matching
如何使用 Perl 检查给定字符串是否包含某个子字符串?
更具体地说,我想查看s1.domain.com 是否存在于给定的字符串变量中。
【问题讨论】:
标签: string perl string-matching
不区分大小写的子字符串示例
这是 Eugene 答案的扩展,它在检查子字符串之前将字符串转换为小写:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
【讨论】:
fc 而不是 lc。
要找出字符串是否包含子字符串,您可以使用index 函数:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
它将返回$substr 在$str 中第一次出现的位置,如果未找到子字符串,则返回-1。
【讨论】:
另一种可能性是使用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,而不是 undef 或 0。
因此,这是一个错误:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
如果s1.domain.com 位于字符串的开头,这将是错误的。我个人不止一次为此感到痛苦。
【讨论】:
index() 在简单情况下比正则表达式更快?
=~、index()、~~ 和 match::simple 似乎都有点 awk-ward ... :-\
domain.com 匹配subdomain.domain.com,有什么想法吗?