Как правильно написать regex для findstr в cmd?

Вопрос или проблема

Я пытаюсь вывести только UUID в Windows и выполняю следующую команду:

wmic csproduct get uuid | findstr /R “[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}”

Вышеуказанная команда возвращает пустую строку.

Если я сделаю следующее:

wmic csproduct get uuid

То будет выведено следующее:

UUID

uuid-example-9596-dj9v

Я пытаюсь вывести только последнюю строку.

Насколько я знаю, findstr использует очень простые регулярные выражения, которые не поддерживают квантификаторы, такие как {5}.

Вам нужно написать в полном объеме:

[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]

Также рекомендую использовать границы слов:

\<[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\>

Вы можете использовать альтернативы, смотрите: https://stackoverflow.com/q/87350/372239

Просто сделайте это:

wmic csproduct get uuid | findstr "\-"

И вы получите только нужную строку.

Ответ или решение

Для того чтобы корректно извлекать UUID в Windows с использованием командной строки и findstr, важно понимать несколько особенностей, связанных с синтаксисом регулярных выражений и ограничениями самого findstr.

1. Проблема с регулярным выражением

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

wmic csproduct get uuid | findstr /R “[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}”

не сработает, потому что findstr не поддерживает расширенные синтаксические конструкции, такие как квантификаторы {n}. Необходимо написать шаблон в более простом виде.

2. Корректный синтаксис

Чтобы отфильтровать UUID, который, как правило, записывается в формате xxxx-xxxx-xxxx-xxxx (где x – это буквы и цифры), вам нужно повторить символы один за другим. Полное регулярное выражение в findstr будет выглядеть следующим образом:

findstr /R "[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]"

3. Использование границ слова

Кроме того, вы можете рассмотреть возможность использования границ слова для более точного поиска, хотя findstr не поддерживает специальные символы для границ. Однако вы можете обернуть ваш шаблон в символы, которые помогут отфильтровать только те строки, которые содержат UUID:

findstr /R "\<[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]-[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\>"

4. Простой подход

Если ваша цель – просто извлечь строку с UUID, вы можете использовать более простой подход и просто искать знак -, который присутствует в UUID:

wmic csproduct get uuid | findstr "-"

Этот способ гарантированно выведет строку, содержащую UUID, без необходимости указывать сложные регулярные выражения.

5. Заключение

Подводя итог, для фильтрации UUID в Windows Command Prompt с использованием wmic и findstr, лучше всего использовать упрощенные регулярные выражения или просто искать строки, содержащие определённые символы. Помните о ограничениях findstr и о том, что перегруженные регулярные выражения могут вызвать больше проблем, чем принести пользы.

Оцените материал
Добавить комментарий

Капча загружается...