2013-05-29 2 views
0

У меня есть диск, который содержит более 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 ссылки?

ответ

0

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

$samples = @() 
$samples += 'P:\PERSON\06\19\09\619090.5577930.DOC' #good 
$samples += 'P:\PERSON\19\09\19090.5577930.DOC' #good 
$samples += 'P:\PERSON\10\10\10\06\19\09\1010100619090.5577930.DOC' #good 
$samples += 'P:\PERSON\06\19\09\619090a.5577930.DOC' #bad 
$samples += 'P:\PERSON\06\19\09\61909090.5577930.DOC' #bad 
$samples += 'P:\PERSON\06\19\09\6190905577930.DOC' #bad 

$regex = '^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\' 
$regex += '(?:(\d)(\d)\\|0(\d)\\)(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?' 
$regex += '(?:\1\2|\3)\4?\5?\6?\7?\8?\d?\.\d+\.\w{3,4}$' 

$samples | % { 
    $_ -match $regex 

} 
2

Я пытался придумать что-то, и если поддерживает PowerShell обратные ссылки, вы можете попробовать это:

^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\(?:0(\d)|(\d{2}))\\(\d{2})\\(?P<t>\d{2})\\(?:(?:\1|\2)\3\4)0?\.\d+\.\w{3,4}$

\1 к \4 относятся к различным группам захвата ранее найденных.

Я проверил несколько строк на regex101.

Единственное, что он примет P:\OPPORTUN\61\90\90\619090.5577930.DOC. Я не слишком уверен, как обойти это только с одним регулярным выражением ... или сделать регулярное выражение еще дольше, чем оно уже (для этого может быть более двух раз).

Это примерно в два раза дольше, если вы хотите, чтобы действительно убедиться, что:

^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\0(\d)\\(\d{2})\\(\d{2})\\(?:\1\2\3)0\.\d+\.\w{3,4}|P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\(\d{2})\\(\d{2})\\(\d{2})\\(?:\4\5\6)\.\d+\.\w{3,4}$

EDIT: До 7 пар цифр:

^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\(?:0(\d)|(\d\d))\\(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(\d\d)\\)?(?:(?:\1|\2)\3?\4?\5?\6?\7?)0?\.\d+\.\w{3,4}

+1

Спасибо за это, ваше решение было не совсем правильно, но он указал мне в правильном направлении, я не знал, что вы могли бы иметь не-захвата групп. –

+0

@DaveSexton Oh! Вы могли бы иметь несколько вхождений '\ d \ d \ /'. Ну, я рад, что помог одним способом. Однако, глядя на ваше регулярное выражение, вы можете сделать его немного короче, объединив '(\ d) (\ d)' as '(\ d \ d)' и вам понадобится только одна обратная ссылка для каждого из них :) – Jerry

Смежные вопросы