문자열에 하위 문자열이 포함되어 있는지 확인


113

Perl을 사용하여 주어진 문자열에 특정 하위 문자열이 포함되어 있는지 어떻게 확인할 수 있습니까?

더 구체적으로, s1.domain.com주어진 문자열 변수에 존재 하는지 확인하고 싶습니다 .

답변:


231

문자열에 하위 문자열이 포함되어 있는지 확인하려면 index함수를 사용할 수 있습니다 .

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

$substrin 의 첫 번째 발생 위치를 반환 $str하거나 하위 문자열을 찾을 수없는 경우 -1을 반환합니다.


6
이 방법은 변수를 사용하여 검색 할 때 특히 선호됩니다. 이렇게하면 정규 표현식 (예 :)에 특수한 문자 (이 변수 문자열에서)를 이중 이스케이프 할 필요가 없습니다 :.
evgeny9 2013

57

또 다른 가능성은 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는 또는 -1대신 일치하는 항목을 찾을 수 없을 때 a를 반환합니다 .undef0

따라서 이것은 오류입니다.

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
대해 질문에 펄 대답을 시도 문자열을 제거 내가 속도를 비교하지만하지 않았다 - =~, index(), ~~match::simple모든 비트 듯 awk... -ward을 : - \
G. CITO에게

또한 비교하는 문자열이 대소 문자를 구분하지 않는지 확인해야합니다. S1.DOMAIN.COM은 하위 문자열에 대해 작동하지 않습니다. 그러나 lc ($ givendomain)을 사용하고 "s1.domain.com"과 비교하면 작동합니다. 또한 부분 문자열이 반드시 올바른 접근 방식은 아닙니다. 위의 eugene 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대소 문자를 구분 비교를.
melpomene
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.