Глядя на C:\APPS\Office
, невозможно определить, является ли это именем каталога или именем файла с именем Office
в каталоге с именем C:\APPS
. Аналогично, C:\APPS\SAFE\Settings.ini
может быть именем каталога. Поэтому я должен предположить, что все приведенные вами примеры должны быть одинаково действительными. Если нет, то вам нужно обновить свой вопрос, чтобы лучше определить, что именно вы ищете с точки зрения ввода и вывода. Но исходя из моей интерпретации вашего вопроса, кажется, вы хотели распознать C:\QUERY
и так,
Регулярное выражение, которое вы должны хотеть:
^((?:[A-Za-z]:\\|\\\\)(?:[^\\\n]+\\)*)(.*?)$
- '^' Совпадения начало строки.
[A-Za-z]
Соответствует A .. Z, a .. z (обычно допустимая буква диска). :
Соответствует двоеточию. \\
Соответствует обратному слэсу sh. |\\\\
Альтернативный выбор от 1 до 4. Выше два обратных слеша. (?:[^\\\n]+\\)*)
Соответствует нулю или более из следующего: один или несколько символов, отличных от backsla sh, без символов перевода строки, за которыми следует символ backsla sh. Шаги с 1 по 6 соответствуют всем уровням пути, кроме последнего, и доступны в группе 1. (.*?)$
Соответствует последнему уровню пути, если он существует, и делает его доступным в группе 2.
См. Regex Demo
Таким образом, при вводе C:\APPS\SAFE\Settings.ini
группа 1 будет C:\APPS\SAFE\
, а группа 2 будет Settings.ini
. Но, как я сказал во введении, из этого ничего не следует выводить.
Если вы уверены, что ваши каталоги не содержат периодов, а ваши файлы содержат периоды, за которыми следуют как минимум 3 символа, то следующее будет соответствовать этим только для каталогов пути в группе 1.
^((?:[A-Za-z]:\\|\\\\)(?:(?:[^\\\n.]+)(?:\\[^\\\n.]+)*)?)(?!.*?\....)(?:.*?)$
См. демонстрацию Regex
Выше также будет соответствовать C:\
.
Если вы делаете не хотите совпадать с C:\
, тогда:
^((?:[A-Za-z]:\\|\\\\)(?:[^\\\n.]+)(?:\\[^\\\n.]+)*)(?!.*?\....)(?:.*?)$
Отрицательное утверждение, (?!.*?\....)
, определяет имена файлов, которые должны иметь как минимум 3 символа после точки. Но так как мы гарантируем, что у каталогов нет периодов, может быть более разумно просто проверить наличие периода: (?!.*?\.)
, чтобы увидеть, является ли это спецификацией файла.