Регулярное выражение для частичного пути

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

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

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

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

До сих пор я пробовал (\/|.*\/), но это не приводит к тому, что путь заканчивается без «/».


person Peter    schedule 28.10.2018    source источник


Ответы (4)


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

Чтобы сломать его

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

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

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

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

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

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

person user10571144    schedule 28.10.2018
comment
Обратите внимание, что вам не нужно экранировать косую черту. Ваше регулярное выражение использует 3 группы захвата, где отсутствует закрывающая скобка для внешней группы. Вы можете опустить 2 внешние группы захвата и сделать внутреннюю группу без захвата. Этот шаблон [^/]+ также будет соответствовать символу разрыва строки, а $ отсутствует там, где вы имеете в виду в вашем объяснении. - person The fourth bird; 29.10.2018

Я бы рекомендовал эту схему:

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

ДЕМО

Это работает следующим образом:

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

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

  • g для поиска нескольких совпадений во входных данных
  • m для обработки каждой строки как отдельного ввода
person slartidan    schedule 28.10.2018

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

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

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

ОНЛАЙН-ДЕМО РЕГРЕСС-ДЕМО

person azro    schedule 28.10.2018

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

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

Замыкающий jkl больше не может соответствовать ни одному шаблону чередования.

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

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

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

В Java:

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

демонстрация регулярных выражений

Пояснение

  • ^ Начало строки
  • / Сопоставить косую черту
  • (?: Non capturing group
    • \w+ Match 1+ word characters (If you want to match more than \w you could use a character class and add to that what you want match)
    • /? Соответствует необязательной косой черте
  • ){0,2} Закройте группу без захвата и повторите 0–2 раза.
  • $ Конец строки
person The fourth bird    schedule 28.10.2018