Как использовать регулярные выражения для папок без файлов? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь использовать регулярное выражение (PHP) для захвата пути к папкам без файлов.

У меня есть эти пути, например:

C:\APPS\Office
C:\APPS\Office Desktop
C:\APPS\SAFE\Settings.ini
\\APPS\Office Desktop
C:\QUERY
C:\APPS\SAFE\Settings.ini

Пока что я ' я пробовал:

^(?:\w\:\\|\\\\)(.+)\\([^.]+)$

Это работает за исключением C: \ QUERY

Также я пробовал:

^(?:\w\:\\|\\\\)((.+)|((.+)\\([^.]+)))$

Но это хуже.

Ответы [ 3 ]

1 голос
/ 07 марта 2020

В качестве альтернативы использованию регулярного выражения вы можете использовать pathinfo и проверить расширение:

$strings = [
    "C:\\APPS\\Office",
    "C:\\APPS\\Office Desktop",
    "C:\\APPS\\SAFE\\Settings.ini",
    "\\\\APPS\\Office Desktop",
    "C:\\QUERY",
    "C:\\APPS\\SAFE\\Settings.ini"
];

foreach ($strings as $string) {
    $pathInfo = pathinfo($string);
    if (!array_key_exists("extension", $pathInfo)) {
        echo $pathInfo["basename"] . PHP_EOL;
    }
}

Вывод

C:\APPS\Office
C:\APPS\Office Desktop
\\APPS\Office Desktop
C:\QUERY

См. Php demo


Если вы не хотите сопоставлять имя файла с указанным расширением c:

^(?!.*\.(?:ini|docx)?$)[^\\\r\n]*(?:\\+[^\r\n\\]+)+$

Regex демо

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

Глядя на C:\APPS\Office, невозможно определить, является ли это именем каталога или именем файла с именем Office в каталоге с именем C:\APPS. Аналогично, C:\APPS\SAFE\Settings.ini может быть именем каталога. Поэтому я должен предположить, что все приведенные вами примеры должны быть одинаково действительными. Если нет, то вам нужно обновить свой вопрос, чтобы лучше определить, что именно вы ищете с точки зрения ввода и вывода. Но исходя из моей интерпретации вашего вопроса, кажется, вы хотели распознать C:\QUERY и так,

Регулярное выражение, которое вы должны хотеть:

^((?:[A-Za-z]:\\|\\\\)(?:[^\\\n]+\\)*)(.*?)$
  1. '^' Совпадения начало строки.
  2. [A-Za-z] Соответствует A .. Z, a .. z (обычно допустимая буква диска).
  3. : Соответствует двоеточию.
  4. \\ Соответствует обратному слэсу sh.
  5. |\\\\ Альтернативный выбор от 1 до 4. Выше два обратных слеша.
  6. (?:[^\\\n]+\\)*) Соответствует нулю или более из следующего: один или несколько символов, отличных от backsla sh, без символов перевода строки, за которыми следует символ backsla sh. Шаги с 1 по 6 соответствуют всем уровням пути, кроме последнего, и доступны в группе 1.
  7. (.*?)$ Соответствует последнему уровню пути, если он существует, и делает его доступным в группе 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 символа после точки. Но так как мы гарантируем, что у каталогов нет периодов, может быть более разумно просто проверить наличие периода: (?!.*?\.), чтобы увидеть, является ли это спецификацией файла.

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

Попробуйте этот шаблон:

^(?:[A-Z]:|\\)\\(?:[\w \\]+\\)?

Демонстрация: https://regex101.com/r/8EnFU8/2

Использование [^.]+ вызывает ваше совпадать, чтобы охватить несколько строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...