Как использовать регулярные выражения, чтобы найти что-то НЕ определенного шаблона - PullRequest
4 голосов
/ 08 декабря 2010

Используя регулярные выражения в стиле Perl, можно ли искать что-то не определенного шаблона?

Например, [^abc] ищет ОДИНОЧНЫЙ ХАРАКТЕР, а не a, b и c.

Но можно ли указать что-то длиннее одного символа?
Например, в следующей строке я хочу найти первое слово, которое не является доменным именем верхнего уровня и не содержит заглавных букв, или, возможно, некоторые более сложные правила, такие как 3-10 символов. В моем примере это должно быть "abcd":

net com org edu ABCE abcdefghijklmnoparacbasd abcd

Ответы [ 3 ]

5 голосов
/ 08 декабря 2010

Вы можете сделать это, используя отрицательные прогнозные утверждения как:

^(?!(?:net|com|org|edu)$)(?!.*[A-Z])[a-z]{3,10}$

Посмотреть

Пояснение:

^                   - Start anchor
$                   - End anchor
(?:net|com|org|edu) - Alternation, matches net or com or org or edu
(?!regex)           - Negative lookahead. 
                      Matches only if the string does not match the regex.

Таким образом, часть (?!(?:net|com|org|edu)$) гарантирует, что входные данные не являются одним из доменов верхнего уровня.

Деталь (?!.*[A-Z]) гарантирует, что на входе нет заглавной буквы.

Деталь [a-z]{3,10}$ обеспечивает длину ввода не менее 3 и не более 10.

4 голосов
/ 08 декабря 2010

Просто используйте оператор "not match":! ~

Так что просто создайте свое выражение и затем увидите, что переменная ему не соответствует:

if ($var !~ /abc/) {
  ...
}
0 голосов
/ 08 декабря 2010

ИМХО, проще выполнить некоторые сопоставления с регулярным выражением, а некоторые проверки с помощью Perl.

#!/usr/bin/env perl

use strict;
use warnings;

my $s = "net com org edu ABCE abcdefghijklmnoparacbasd abcd";

# loop short words (a-z might not be what you want though)
foreach( $s =~ /(\b[a-z]{3,10}\b)/g ){
    print $_, "\n" if is_tpl($_);  
}

Кстати, есть много доменов верхнего уровня ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...