Regex, чтобы получить последний каталог и имя файла из пути - PullRequest
0 голосов
/ 24 марта 2020

Итак, у меня есть пример пути c: \ folder1 \ folder2 \ folder3 \ file.txt Я хочу, чтобы regex извлекал folder3 \ file.txt

Я подумал, что это будет все после

1. a slash
2. followed by any number of non slash characters
3. followed by a slash
4. followed by any number of non slash characters
5. followed by a dot 
5.1 that is not (eventually) followed by a slash

У меня большая часть работы работает

\\(?=[^\\]*(?=\\(?=[^\\]*(?=[\.]))))(.*)

, если я не сделаю это:

c: \ folder1 \ folder2 \ fol.der3 \ file.txt (fol.der3 - это имя каталога)

или это

c: \ folder1 \ folder2 \ folder3 \ file.txt \ (технически здесь нет файла)

Итак, у меня есть все, кроме шага 5.1

Итак, я попытался добавить отрицательный прогноз после моего поиска точек, чтобы исключить точки, которые имеют sla sh где-то после них:

(?=[\.][^\\]*(?![\\]))

но это не сработало

Есть идеи?

Спасибо Крис

Ответы [ 2 ]

0 голосов
/ 24 марта 2020
[^\\]+\\[^\\]+$
  1. [^\\]+ - соответствует любому символу, кроме \ один или несколько раз
  2. \\ - соответствует одному \
  3. [^\\]+ - соответствует любому символу, кроме \ один или несколько раз
  4. $ - соответствует концу строки

Этого достаточно, чтобы получить последние две части вашего URI.

Является ли последний фрагмент папкой или файлом, на самом деле невозможно определить с помощью регулярных выражений, поскольку

  • файлы не обязательно должны иметь расширение
  • URI для папка не заканчивается на sla sh

Если вы не уверены в своих входных данных и это доказывает, что одна из этих двух точек недействительна, тогда регулярное выражение следует изменить соответствующим образом.

0 голосов
/ 24 марта 2020

Вы можете использовать группу захвата вместо использования обходного пути и все еще использовать классы отрицательных символов .

\\([^\\]+\\[^\\.]+\.[^\\.]+)$

Объяснение

  • \\ Совпадение \
  • ( Захват группа 1
    • [^\\]+\\ Совпадение 1+ вхождений любого символа, кроме \ и затем соответствует \
    • [^\\.]+\. Соответствует 1+ вхождениям любого символа, кроме \ или ., а затем соответствует \
    • [^\\.]+ Соответствию 1+ вхождениям любого символа, кроме \ или .
  • ) Закрыть группу 1
  • $ Конец строки

Regex demo

...