Проверить, содержит ли строка подстроку

113

Как я могу проверить, содержит ли данная строка определенную подстроку, используя Perl?

Более конкретно, я хочу увидеть, s1.domain.comприсутствует ли в данной строковой переменной.

Белгин Фиш
источник

Ответы:

232

Чтобы узнать, содержит ли строка подстроку, вы можете использовать indexфункцию:

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

Он вернет позицию первого вхождения $substrin $strили -1, если подстрока не найдена.

Евгений Ярмаш
источник
6
Этот способ особенно предпочтителен при поиске с использованием переменной - так вам не придется вводить двойные escape-символы (в этой строке переменных), которые являются специальными для регулярных выражений (например, :).
evgeny9 02
57

Другая возможность - использовать регулярные выражения, чем знаменит Perl:

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

Обратные косые черты необходимы, потому что a .может соответствовать любому символу. Вы можете обойти эту проблему , используя \Qи \Eоператор.

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

Или вы можете сделать, как сказал Евгений Y, и использовать функцию индекса . Небольшое предупреждение: если индекс -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()это быстрее, чем регулярные выражения в простом случае?
G. Cito
1
Попытка PERL ответ на вопрос об удалении подстроки - я не сравнивал скорость , но =~, index(), ~~и match::simpleвсе , казалось , немного awk-ward ...: - \
Г. ЦИТО
Вы также должны убедиться, что строки, которые вы сравниваете, не чувствительны к регистру. S1.DOMAIN.COM не будет работать с подстрокой. Но если вы lc ($ givendomain), а затем сравните это с «s1.domain.com», то это сработает. Кроме того, подстрока не обязательно является правильным подходом - см. Мою заметку выше к ответу eugene y
BlueChips23
@David W. Как-то я не могу найти domain.comсоответствие subdomain.domain.comс помощью REGEX выше, есть идеи?
avrono
14

Пример подстроки без учета регистра

Это расширение ответа Юджина, которое преобразует строки в нижний регистр перед проверкой подстроки:

if (index(lc($str), lc($substr)) != -1) {
    print "$str contains $substr\n";
} 
Джеймс Оравек
источник
1
Обратите внимание, что fcэто рекомендуется lcдля сравнений без учета регистра.
melpomene