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

У меня есть пути, подобные этим (отдельные строки):

/
/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,2}\/?)

Чтобы сломать это

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

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

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

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

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

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

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

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

DEMO

Это работает так:

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

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

  • g искать несколько совпадений на входе
  • m рассматривать каждую строку как отдельный ввод

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

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

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

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

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

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

В Java:

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

Regex demo

объяснение

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

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

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

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

Онлайн ДЕМО Regex DEMO

Другие вопросы по тегам