Perl регулярное выражение с отрицательным взглядом? не могу понять, как это сделать правильно - PullRequest
1 голос
/ 16 июля 2010

Я пытаюсь заставить это работать с регулярным выражением perl, но не могу понять это ... Я хочу получить любой URL, который имеет ".website".в нем, кроме тех, которые похожи на это (с "en" предшествующим ".website."выше отклонен

Ответы [ 3 ]

1 голос
/ 17 июля 2010

Отрицательные утверждения за кадром плохо работают, если контент, который вы пытаетесь сопоставить после , является настолько общим, что он соответствует самому утверждению.Подумайте:

perl -wle'print "en.website" =~ qr/(?<!en\.)web/'        # doesn't match
perl -wle'print "en.website" =~ qr/(?<!en\.)[a-z]/'      # does match, because [a-z] is matching the 'en'

Лучшее, что можно сделать здесь, - это то, что предложил Дэвид: используйте два шаблона для выявления хороших и плохих значений:

my @matches = grep {
     /$pattern1/ and not /$pattern2/
} @strings;

... где pattern1 соответствует всемURL-адреса, а pattern2 соответствует только URL-адресам en.

1 голос
/ 16 июля 2010

Я бы просто сделал это в два шага: сначала используйте общее регулярное выражение для проверки любого URL (или, скорее, всего, что выглядит как URL). Затем проверьте каждый результат, который соответствует этому, с другим регулярным выражением, которое ищет en, встречающееся в хосте до wordpress, и отбросьте все, что соответствует.

0 голосов
/ 17 июля 2010

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

сначала позволяет отфильтровать URL, которые имеют "en", поскольку это не те URL, которые мы хотим

        $re1='(.*)';    # Any number of characters
        $re2='(en)';    # Word 1
        $re3='(.*)'; # Any number of characters


        $re=$re1.$re2.$re3;
        if ($linkhtml =~ /$re/)
        {


    #do nothing, as we don't want a link with "en" in it

        }

        else {

        ### find urls with ".website."
        $re1='(.*)';    # Any number of characters
        $re2='(\.)';    # period
        $re3='(website)';   # Word 1
        $re4='(\.)';    # period
        $re5='(.*)'; # Any number of characters


        $re=$re1.$re2.$re3.$re4.$re5;

            if ($linkhtml =~ /$re/) {

            #match to see if it is a link that has ".website." in it


            ## do something with the data as it matches, such as:
                       print "linkhtml

            }

           }
...