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

89

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

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

Теги:
string
string-matching

3 ответа

183
Лучший ответ

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

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

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

  • 5
    Этот способ особенно предпочтителен, когда вы ищете с использованием переменной - таким образом вам не придется дважды экранировать символы (в этой строке переменной), которые являются специальными для регулярных выражений (например, : .
48

Другая возможность - использовать регулярные выражения, что является тем, что известно 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 возвращает a -1, когда он не может найти совпадение вместо undef или 0.

Таким образом, это ошибка:

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

Это будет неправильно, если s1.domain.com находится в начале строки. Я лично был сожжен этим не один раз.

  • 0
    Я полагаю, index() быстрее, чем регулярные выражения в простом случае?
  • 1
    Попытка Perl ответ на вопрос о снятии подстроки - я не сравнивал скорость , а =~ , index() , ~~ и match::simple все , казалось , немного awk -ward ...: - \
Показать ещё 2 комментария
11

Пример нечувствительности к регистру

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню