web-dev-qa-db-ja.com

文字列に部分文字列が含まれているかどうかを確認する

Perlを使って、与えられた文字列が特定の部分文字列を含んでいるかどうかをどうやって確認できますか?

より具体的には、私はs1.domain.comが与えられた文字列変数に存在するかどうか見たいです。

100
Belgin Fish

文字列に部分文字列が含まれているかどうかを調べるには、 index 関数を使用できます。

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

$substr内で$strが最初に出現した位置を返します。サブストリングが見つからない場合は-1を返します。

213
Eugene Yarmash

もう一つの可能​​性は 正規表現 を使うことです。これは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 関数を使うこともできます。単なる警告の言葉:Indexは、undef-1ではなく、一致するものが見つからない場合に0を返します。

したがって、これはエラーです。

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

s1.domain.comが文字列の先頭にある場合、これは間違っています。私は個人的にこれに2回以上焼かれました。

53
David W.

大文字と小文字を区別しないサブストリングの例

これはEugeneの答えを拡張したもので、部分文字列をチェックする前に文字列を小文字に変換します。

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