Perl regex использование отрицательного взгляда? может казаться, не выясняет, как сделать это правильно

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

   $linkhtml =  'http://en.search.website.com/?q=beach&' ;

Это - пример URL, что я хотел бы быть возвращенным regex, в то время как тот выше отклоняется

   $linkhtml =  ' http://exsample.website.com/?q=beach&' ;

Вот моя попытка его.. любой совет относительно того, что я делаю неправильно, ценится

   $re2='(?<!en)'; # Any number of characters
   $re4='(.*)'; # Any number of characters
   $re6='(\.)'; # Any Single Character 4
   $re7='(website)'; # Word 2
   $re8='(\.)'; # Any Single Character 5
   $re9='(.*)'; # Any number of characters

   $re=$re4.$re2.$re6.$re7.$re8.$re9;

   if ($linkhtml =~ /$re/)
1
задан Rick 16 July 2010 в 20:38
поделиться

3 ответа

Негативные утверждения lookbehind не работают, если содержимое, которое вы пытаетесь проверить после утверждения, настолько общее, что оно будет соответствовать самому утверждению. Рассмотрим:

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;

...где шаблон1 соответствует всем URL, а шаблон2 соответствует только URL 'en'.

1
ответ дан 2 September 2019 в 23:00
поделиться

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

1
ответ дан 2 September 2019 в 23:00
поделиться

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

сначала позволяет отфильтровать 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

            }

           }
0
ответ дан 2 September 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: