Регулярное выражение для частичного пути - PullRequest
0 голосов
/ 28 октября 2018

У меня есть такие пути (одиночные линии):

/
/abc
/def/
/ghi/jkl
/mno/pqr/
/stu/vwx/yz
/abc/def/ghi/jkl

Мне просто нужны шаблоны, которые соответствуют третьему «/».Другими словами, пути, содержащие только «/» и до первых двух каталогов.Однако, некоторые из моих каталогов заканчиваются на "/", а некоторые нет.Итак, я хочу получить результат:

/
/abc
/def/
/ghi/jkl
/mno/pqr/
/stu/vwx/
/abc/def/

До сих пор я пробовал (\/|.*\/), но это не приводит к завершению пути без "/".

Ответы [ 4 ]

0 голосов
/ 28 октября 2018

Ваше регулярное выражение (\/|.*\/) использует чередование, которое соответствует либо косой черте, либо любым символам, жадным 0+ раз, с последующим совпадением косой черты.

Так, например, /ghi/jkl, первое совпадение будетпервый слеш.Тогда эта часть .* следующего шаблона будет совпадать с первой g до конца строки.Двигатель будет возвращаться к последнему наклонному слешу, чтобы заполнить весь шаблон .*\/.

Конечный jkl больше не может быть сопоставлен ни с шаблоном чередования.

Обратите внимание, что вы нене нужно экранировать косую черту.

Вы можете использовать:

^/(?:\w+/?){0,2}$

В Java:

String regex = "^/(?:\\w+/?){0,2}$";

Regexдемо

Пояснение

  • ^ Начало строки
  • / Матч прямой косой черты
  • (?: Группа без захвата
    • \w+ Совпадение 1+ символов слова (Если вы хотите сопоставить более чем \w, вы можете использовать класс символов и добавить к нему то, что выхотите совпадение)
    • /? Совпадение необязательный слеш
  • ){0,2} Закройте группу без захвата и повторите 0 - 2 раза
  • $Конец строки
0 голосов
/ 28 октября 2018

Я бы порекомендовал этот шаблон:

/^(\/[^\/]+){0,2}\/?$/gm

DEMO

Работает так:

  • ^ ищет начало строки
  • (\/[^\/]+) ищет элемент пути
    • ( запускает группу
    • \/ ищет косую черту
    • [^\/]+ ищет некоторые символы без косой черты
  • {0,2} говорит, что от 0 до 2 из этих элементов пути должны быть найдены
  • \/? позволяет использовать косые черты
  • $ ищет конец строки

Используйте эти модификаторы:

  • g для поисканесколько совпадений на входе
  • m для обработки каждой строки как отдельного ввода
0 голосов
/ 28 октября 2018
^((\/([^/]+){0,2}\/?)

Чтобы разбить его

  • ^ - начало строки

  • {0,2} означает повторить предыдущееот 0 до 2 раз.

  • Затем он заканчивается дополнительной косой чертой, используя ?

  • Конец строки равен $, поэтомуэто не соответствует более длинным строкам.

  • () Вокруг всего этого, чтобы захватить его.

Но я укажу, чтопочти всегда неправильный ответ для соответствия директории.Некоторые каталоги имеют особое значение, например /../ .. которое на самом деле идет вверх два каталога, а не вниз.Вместо этого лучше использовать API системного каталога для более надежных результатов.

0 голосов
/ 28 октября 2018

Вам нужен шаблон типа ^(\/\w+){0,2}\/?$, он проверяет, что у вас есть (/ и имя) не более 2 раз и что он может заканчиваться на /

Подробности:

  • ^: начало строки
  • (\/\w+): косая черта (экранированная) и слово-символ, все в группе
  • {0,2} группа может быть 0/1/2 раза
  • \/?: косая черта (экранированная) может быть 0 или 1 раз

Online DEMO Regex DEMO

...