2016-08-06 3 views
3

Я пытаюсь отфильтровать путь в первой группе захвата.Javascript Regex: Проложить путь до последнего появления в группе захвата

В настоящее время первая группа захвата извлекает путь, включая его родительские пути.

Хотя это поведение совершенно нормально, я не хочу, чтобы сам путь включался. Группа захвата должна извлекать только родительские пути, если они есть.

Группа захвата 2 должна оставаться как есть. (См красные цифры в картинке ниже)

Regex:

/^(?:music|pictures)\/tom((?:\/((?:[\w-]+(?:[ ]+[\w-]+)*)))*)$/gm 

матч против:

music/tom/foldername 
music/tom/folder name 
music/tom/foldername/folder2 

Ожидаемые результаты:

enter image description here

[MATCH 1] Я ожидаю, что первый матч (зеленый), чтобы быть пустым, так как он не имеет родителей, ни порожденных

[MATCH 2] то же, что и [MATCH 1]

[MATCH 3] Я ожидаю, что первый матч (зеленый) - только содержат родителей


Regex Демы: https://regex101.com/r/yN2kK2/1


Технически я мог бы просто сохранить свое регулярное выражение и использовать Javascript для ожидаемого поведения:

str.substr(str.lastIndexOf('/'))

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

+1

что-то вроде ** ['this'] (https://regex101.com/r/yN2kK2/2) ** – rock321987

ответ

3

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

^(?:music|pictures)\/tom(\/(?:[\w-]+(?:[ ]+[\w-]+)*))*(\/(?:[\w-]+(?:[ ]+[\w-]+)*))$ 
         <---------------------------> 
         Captures the parent directory 

Regex Demo

Если вы считаете, все после /tom (и как раз перед последним) в качестве родительского каталога, вы можете изменить регулярное выражение как

^(?:music|pictures)\/tom((?:\/(?:[\w-]+(?:[ ]+[\w-]+)*))*)(\/(?:[\w-]+(?:[ ]+[\w-]+)*))$ 

Regex Demo

+1

Splendid work @ rock321987. Большое вам спасибо, но еще раз за вашу выдающуюся помощь здесь, в Stackoverflow. Посмотрев на ваше описание regex выше и объяснение на regex101.com, это имеет смысл для меня сейчас. – Steven

+1

@SteveMuster рад помочь .. – rock321987