Использование регулярных выражений в findstr

Я пытаюсь реализовать скрипт ловушки в Subversion, используя findstr с регулярным выражением. Цель состоит в том, чтобы обеспечить включение записи в сообщение журнала, которая соответствует формату, используемому нашим инструментом отслеживания проблем (Atlassian JIRA). Каждая из наших задач состоит из 4–6 заглавных букв и 2–4 цифр, разделенных дефисом (например, «TEST-554» или CMMGT-392"). В соответствии с инструкциями в документации Subversion я создал пакетный файл для проверьте сообщение журнала на правильно отформатированную запись, используя регулярное выражение

findstr ([A-Z]{3,6}\-[0-9]{2,4}) > nul

Я протестировал регулярное выражение в ряде инструментов тестирования, и, похоже, оно работает, но когда я запускаю его как часть скрипта ловушки, оно не возвращает совпадение. В качестве своего рода «контроля» я попытался использовать регулярное выражение

findstr ...... > nul

и смог найти совпадение. Кто-нибудь видит, где я ошибаюсь?


person wally edwards    schedule 29.02.2012    source источник
comment
я думаю, это та же проблема, что и в stackoverflow.com/q/358764/1176601 - {} не поддерживаются...   -  person Aprillion    schedule 01.03.2012
comment
Спасибо, deathApril - это вполне могло быть частью проблемы; благодаря ответу бонсайвикинга ниже я смог обойти это.   -  person wally edwards    schedule 01.03.2012


Ответы (1)


findstr для использования регулярных выражений требуется параметр /R, но он не поддерживает расширенные регулярные выражения, поэтому такие вещи, как счетчики ({3,6}), не работают. Кроме того, совпадения ноль или один (?) не работают, поэтому делать то, что вы хотите, будет довольно многословно. Кроме того, английская система сортировки Windows означает, что [A-Z] соответствует 'A', 'b', 'B', 'z' и 'Z', но не 'a'. Вот что может сработать:

findstr /R "[ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9] [ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ][ABCDEFGHIJKLMNOPQRSTUVWXYZ]-[0-9][0-9][0-9][0-9]"

Эта невероятно многословная команда может превышать максимальную длину команды оболочки (не проверялось), но в основном делает то, что вам нужно, содержа отдельное совпадение для каждой из перестановок букв и цифр. Еще одна странная особенность findstr: если вы не используете параметр /C, пробелы в вашей строке совпадения будут использоваться для разделения ее на отдельные выражения совпадения.

Если у вас есть какой-либо вариант помимо findstr, такой как PowerShell, Python или даже VBScript, я бы посоветовал вам использовать его. Удачи!

РЕДАКТИРОВАТЬ: вот однострочный Perl, который я использовал для создания вышеуказанной команды:

perl -le 'BEGIN{$\=" "}for $x (3..6){for $y (2..4){print join("","[",A..Z,"]") x $x, "-", "[0-9]" x $y}}'
person bonsaiviking    schedule 29.02.2012
comment
Итак, что такое превосходная форма слова verbose — verbose-est? Что бы это ни было, вы выиграли, бонсайвик. К сожалению, он слишком длинный, но он действительно навел меня на правильный путь. Я обнаружил, что связь между SVN и JIRA не чувствительна к регистру, поэтому везде заменила [ABCD...] на [A-Z]. Пока пользователь вводит правильно отформатированный номер JIRA, фиксация выполняется и возникает ссылка на JIRA. - person wally edwards; 01.03.2012