Регулярное выражение для частичного пути
У меня есть пути, подобные этим (отдельные строки):
/
/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
Это работает так:
^
ищет начало строки(\/[^\/]+)
ищет элемент пути(
начинает группу\/
ищет косую черту[^\/]+
ищет не косые символы
{0,2}
говорит, что от 0 до 2 из этих элементов пути должны быть найдены\/?
позволяет убирать косые черты$
ищет конец строки
Используйте эти модификаторы:
g
искать несколько совпадений на входеm
рассматривать каждую строку как отдельный ввод
Ваше регулярное выражение (\/|.*\/)
использует чередование, которое соответствует либо косой черте, либо любому символу, который 0+ раз жадный, с последующим сопоставлением косой черты.
Так например /ghi/jkl
, первый матч будет первым слешем. Тогда эта часть .*
следующего шаблона будет совпадать с первым g
до конца строки. Двигатель будет возвращаться на последнюю косую черту, чтобы заполнить все .*\/
шаблон.
Трейлинг jkl
больше не может быть сопоставлено ни с одним шаблоном чередования.
Обратите внимание, что вам не нужно избегать косой черты.
Вы можете использовать:
^/(?:\w+/?){0,2}$
В Java:
String regex = "^/(?:\\w+/?){0,2}$";
объяснение
^
Начало строки/
Матч прямой слеш(?:
Группа без захвата\w+
Совпадение 1+ слов (если вы хотите, чтобы совпадение было больше, чем\w
Вы можете использовать класс символов и добавить к тому, что вы хотите, чтобы соответствовать)/?
Сопоставить необязательный слеш
){0,2}
Закройте группу без захвата и повторите 0 - 2 раза$
Конец строки
Вам нужен шаблон как ^(\/\w+){0,2}\/?$
проверяет что у тебя есть ( /
и имя) не более 2 раз и этим оно может закончиться /
Подробности:
^
: начало строки(\/\w+)
: косая черта (экранированный) и слово-символ, все в группе{0,2}
группа может быть 0/1/2 раза\/?
: косая черта (экранированная) может быть 0 или 1 раз