Перевірте, чи містить рядок підрядку


113

Як я можу перевірити, чи містить даний рядок певну підрядку, використовуючи Perl?

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

Відповіді:


231

Щоб дізнатись, чи містить рядок підрядку, ви можете скористатися indexфункцією:

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

Він поверне позицію першого появи $substrв $str, або -1, якщо підрядка не знайдена.


6
Цей спосіб особливо бажаний, коли ви шукаєте за допомогою змінної - таким чином вам не доведеться подвоювати символи (у цій змінній рядку), які є спеціальними для регулярних виразів (наприклад :).
evgeny9

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);
}

Або ви можете зробити так, як заявлено yugene y , і використовувати функцію індексу . Просто слово попередження: 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знаходиться на початку вашого рядка. Мене особисто на цьому спалювали не раз.


Я припускаю, що index()це швидше, ніж регулярні вирази в простому випадку?
G. Cito

1
Спроба PERL відповідь на питання про видалення підрядка - я не порівнював швидкість , але =~, index(), ~~і match::simpleвсе , здавалося , трохи awk-ward ...: - \
Г. ЦІТО

Ви також повинні переконатися, що рядки, які ви порівнюєте, не відрізняються від регістру. S1.DOMAIN.COM не буде працювати для підрядків. Але якщо ви lc ($ givendomain), а потім порівнюєте це з "s1.domain.com", то це спрацює. Крім того, підрядка не обов'язково є правильним підходом - див. Мою примітку до відповіді
eugene

@David W. Якось я не можу domain.comдомогтися відповідності subdomain.domain.comза допомогою REGEX вище, будь-які ідеї?
авроно

14

Приклад нечутливої ​​підрядки

Це розширення відповіді Євгена, яке перетворює рядки в малі регістри перед тим, як перевірити наявність підрядка:

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

1
Зауважте, що fcце рекомендується lcдля порівняння, що не враховує регістри.
Мельпомена
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.