2017-02-22 19 views
2

Учитывая т.е следующие строки:Извлечения папки и сохранить регулярное выражение порядка группы интактных

/folder/subfolder/all 
/folder/subfolder/all?a=b 
/folder/anothersubfolder/all?a=b 
/folder/all 
/folder/all?a=b 
/folder/anothersubfolder 
/folder/anothersubfolder/all 
/folder 

Подпапка «все» предопределены и должны быть извлечены seperatetly из любой другой подпапки, которые могут или не могут существовать в строке ,

Регулярное выражение, как

^\/(folder)(\/[^/?]*)?(\/[^/?]*)?(\?.*)?$ 

не работает для меня. Группа, содержащая разные папки, должна быть исправлена. При этом регулярное выражение подпапки «все» либо в группе 2 или 3.

Результаты регулярных выражений должны быть что-то вроде:

  • Группы 1:/папки (обязательно может быть только «/ папкой»)
  • Группа 2:/вложенная папка (необязательно может быть любая строка за исключением «/ все»)
  • Группа 3:/все (по желанию может быть только «/ все»)
  • Группа 4: а = Ь (факультативно любой набор параметров)
+0

Обратите внимание, что не представляется целесообразным группировать «папку», поскольку его содержимое всегда будет одинаковым. – Aaron

ответ

1

^\/(folder)((?:\/(?!all)[^/?]*)?)((?:\/all)?)((?:\?.*)?)$

[["folder", "/subfolder",  "/all", "" ], 
["folder", "/subfolder",  "/all", "?a=b"], 
["folder", "/anothersubfolder", "/all", "?a=b"], 
["folder", "",     "/all", "" ], 
["folder", "",     "/all", "?a=b"], 
["folder", "/anothersubfolder", "",  "" ], 
["folder", "/anothersubfolder", "/all", "" ], 
["folder", "",     "",  "" ]] 

Есть две основных приемов здесь:

  1. Номер захватывая группы ?: которые говорят движку регулярных выражений, чтобы не держать на матч, но по-прежнему использовать его для слипания регулярных выражений частей вместе. Это позволяет нам делать такие вещи, как ((?:stuff)?), что делает обязательной группу, которая может быть пуста.

  2. Отрицательный lookahead ?!, который сообщает регулярному выражению НЕ соответствовать определенному шаблону. Таким образом, в этом случае (?!all) говорит, что «все» не могут быть во втором блоке каталога. (обратите внимание: это означает, что второй каталог не может начинаться с «все»)

+0

Я думаю, вы могли бы упростить '((?: \/All)?)' In '(\/all)?' Для одного и того же результата, хотя он мог бы изменить результат от пустой строки до значения null/undefined в зависимости от язык. – Aaron

+0

@Aaron, точно. Это выбор между пустой строкой и null/undefined. Полагаю, это зависит от того, что лучше для OP. – user12341234