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


113

Perlを使用して、特定の文字列に特定の部分文字列が含まれているかどうかを確認するにはどうすればよいですか?

より具体的にs1.domain.comは、与えられた文字列変数にが存在するかどうかを確認したいと思います。

回答:


231

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

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

$substrin が最初に出現する位置を返し$strます。部分文字列が見つからない場合は-1 を返します。


6
この方法は、変数を使用して検索する場合に特に適しています。この方法を使用すると、(このような:)文字列内の正規表現に特別な文字をダブルエスケープする必要がなくなります。
evgeny9 2013

57

もう1つの可能性は、Perlが有名な正規表現を使用することです。

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

.任意の文字に一致する可能性があるため、バックスラッシュが必要です。\Qand \E演算子を使用すると、これを回避できます。

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

または、ユージーンyで述べたようにして、インデックス関数を使用することもできます。警告の言葉:インデックスは-1undefまたはの代わりに一致が見つからない場合にaを返します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 2016

1
アンはについての質問にperlの答えをしようとしたサブストリングを削除する -私はスピードを比較しませんでしたが=~index()~~およびmatch::simpleすべてのビットに見えたawk... -wardを: - \
G. CITO

また、比較する文字列で大文字と小文字が区別されないことを確認する必要もあります。S1.DOMAIN.COMは部分文字列に対しては機能しません。しかし、lc($ givendomain)を実行し、それを「s1.domain.com」と比較すると、動作します。また、部分文字列は必ずしも正しいアプローチであるとは限りません。ユージーンyの応答に関する上記の私のメモを参照してください
BlueChips23

@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
メルポメン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.