У меня есть диск, который содержит более 8 миллионов файлов и является областью хранения файлов для CRM-системы. Файлы хранятся в определенном формате, и каждый из них должен иметь соответствующую запись в базе данных. Однако из-за очень плохой безопасности мир и жена также создают файлы на одном диске. Моя задача - определить недопустимые файлы, которые я использую, используя Powershell и регулярное выражение. Типичный действительный путь к файлу будет выглядеть примерно так:Regex требуется для соответствия пути к файлу, где путь к файлу получен из имени файла.
P:\PERSON\06\19\09\619090.5577930.DOC
Все файлы на диске под названием P: который содержит четыре подкаталоги, называемые: EVENT, OPPORTUN, ор или человека. Каждое из них содержит переменное количество подкаталогов, имя которых колеблется от 00 до 99, а имя файла - два набора цифр, разделенных периодом и сопровождаемое расширением.
Регулярное выражение, я использую, чтобы соответствовать этому образцу является:
^P:\\(EVENT|OPPORTUN|ORGANISA|PERSON)\\(\d{2}\\)+\d+\.\d+\.\w{3,4}$
Сложность в том, что действительный файл также имеет связь между первым набором цифр в имени файлов и путь к папке, к югу, который это:
Удалить последнюю цифру.
Если длина цифры - это нечетное число, добавьте начальный ноль.
Разделите полученное число на пары, и это должно быть путь.
Таким образом, используя вышеприведенный пример:
Первый набор цифр являются: 619090
Удалите последнюю цифру: 61909
Длина нечетно так добавить ведущий ноль: 061909
Разделите на пары: 06 \ 19 \ 09
Мой вопрос заключается в том, может ли эта логика быть включена в мое регулярное выражение, есть ли способ сделать это, используя forward или b ack ссылки?
Спасибо за это, ваше решение было не совсем правильно, но он указал мне в правильном направлении, я не знал, что вы могли бы иметь не-захвата групп. –
@DaveSexton Oh! Вы могли бы иметь несколько вхождений '\ d \ d \ /'. Ну, я рад, что помог одним способом. Однако, глядя на ваше регулярное выражение, вы можете сделать его немного короче, объединив '(\ d) (\ d)' as '(\ d \ d)' и вам понадобится только одна обратная ссылка для каждого из них :) – Jerry