Regex: сопоставить все перед изображением - PullRequest
2 голосов
/ 27 марта 2012

url1: /dir-images/no1/top-left.gif
url2: /test-1/test-2/test

Я хочу сопоставить путь до последней косой черты, если это файл изображения (url1), он же /dir-images/no1/ и соответствует целомупуть, если он не (url2), /test-1/test-2/test

пробовал ^([\=\/\.\w-]+\/)+ это может получить путь до последней косой черты, независимо от того, что после нее ..

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Попробуйте:

^([\=/.\w-]+/)+((?!.*\.gif$).*|)

Часть с (?!) - это взгляд в будущее.Это что-то вроде заявления if.Есть два разных вида: ?= и ?!.Первый является нормальным, если второй - «если нет».

В вашем случае, я просто спрашиваю, не является ли окончание gif?И тогда я сопоставляю все.

0 голосов
/ 27 марта 2012

В одну сторону (с ароматом perl):

m|\A(.*/(?(?!.*\.gif$).*))|

Пояснение:

m| ... |              # Regexp.
\A                    # Begin of line.
(                     # Group 1.
  .*/                 # All characters until last slash.
  (?                  # Conditional expression.
    (?!.*\.gif$)      # If line doesn't end with '.gif', match...
    .*)               # ... until end of line.
)

Тестирование ...

Содержимое script.pl:

use warnings;
use strict;

while ( <DATA> ) { 
    printf qq[%s\n], $1 if m|\A(.*/(?(?!.*\.gif$).*))|;
}

__DATA__
/dir-images/no1/top-left.gif
/test-1/test-2/test

Запустите его как:

perl script.pl

и следующий результат:

/dir-images/no1/
/test-1/test-2/test
...