2014-10-31 2 views
0

Я получил эту строку:Регулярного выражения, чтобы исключить и захватить дополнительную подстроку

A. rest/asks/foo.bar.json 
B. rest/asks/foo.bar 

Мне нужно регулярное выражение, которое позволит мне захватить следующие подстроки:

1. 'rest' 
2. 'asks' 
3. '/foo.bar'(optional) 
4. '.json' (optional) 

Я провел некоторые часов поиск решения проблемы, но, к сожалению, не найдено решение

Прочитано:

^(rest)\/([^\/\.]+)(.+)?(?=(\.json)) 

Но \.json требуется в этом случае

Результаты:

А. rest/asks/foo.bar.json

1. [0-4] `rest` 
2. [5-9] `asks` 
3. [9-17] `/foo.bar` 
4. [17-22] `.json` 

B. rest/asks/foo.bar

Your pattern does not match the subject string. 

Пробовал это:

^(rest)\/([^\/\.]+)(.+)?(?=(\.json)?) 

Результаты:

А. rest/asks/foo.bar.json

1. [0-4] `rest` 
2. [5-9] `asks` 
3. [9-17] `/foo.bar.json` 

B. rest/asks/foo.bar

1. [0-4] `rest` 
2. [5-9] `asks` 
3. [9-17] `/foo.bar` 

Может кто-нибудь мне помочь?

Как я могу выражать подстроки matche, как мне нужно?

Вы можете проверить регулярное выражение здесь: http://regex101.com/

ответ

4
  • использовать оператор OR, чтобы иметь $ или .json в конце: (?=$|(\.json))
  • сделать свой шаблон ловли "foo.bar" не жадный: (.+?)?, чтобы не поймать .json
^(rest)\/([^\/\.]+)(.+?)?(?=$|(\.json)) 

Regular expression visualization

+0

Это работает мужчина! Большое спасибо! Где вы создали диаграмму? –

+0

На [Debuggex] (https://www.debuggex.com/). – zessx

1

Вам не нужно искать положительные результаты. (.*?)(\.json)? будет записывать символы до \.json в необязательную группу и захватывать .json в другую необязательную группу.

^(rest)\/([^\/\.]+)(.*?)(\.json)?$ 

DEMO

+0

Это хорошо, но вам нужно что-то изменить - измените '(?: (. +?) (\. Json)?)' На (?: (. +?) (\. Json)?)? ', Чтобы сделать это необязательный. Он не будет работать правильно для 'rest/asks', если нет. –

+1

Как насчет этого http://regex101.com/r/bR6fI0/3? –

2

Вашего первое регулярное выражение это хорошо, но вы забыли 1 вещь: Вы можете закончить без.JSON:

Для этого вы должны сказать, что вы можете иметь .json или конец строки $: (?=$|(\.json))

Тогда у вас есть: ^(rest)\/([^\/\.]+)(.+?)?(?=$|(\.json))

DEMO (Посмотрите на правой панели на информации матча)

Надеюсь, что это поможет.

Смежные вопросы