#regex #windows #powershell-3.0
Вопрос:
Итак, вот пример ниже.
Application Details for the XYZ application:
=========================================================
Application Name: XYXZW1
Application Id: XYZ353WERX
Application Details for the XYZ application:
=========================================================
Application Name: XYXZW2
Application Id: XYZ353WERX
Application Details for the XYZ application:
=========================================================
Application Name: XYXZW3
Application Id: XYZ353WERX
Secret Key: XYZ86JBHHSD
Application Details for the XYZ application:
=========================================================
Application Name: XYXZW4
Application Id: XYZ353WERX
Secret Key: XYZ86JBHHSD
Теперь я хочу, чтобы регулярное выражение соответствовало только тем «Имя приложения: значение», которые содержат пару «Секретный ключ: значение» в Windows powershell.
Я не уверен, что это может быть ссылка на регулярное выражение, и оно не работает в Windows PowerShell.
$input_path = ‘C:UsersSteveDownloadsinput.txt’
$regex = 's*Application Name:s*.*r?ns*(?=Application Id (ClientId):s*.*r?ns*Secret Key:s*.*)|s*Secret Key:s*.*'
select-string -Path $input_path -Pattern $regex -AllMatches | Write-Output
Все типы регулярных выражений хорошо работают на разных платформах(пробовали несколько), но не в Windows PowerShell.
Результат должен выглядеть следующим образом:
Application Name: XYXZW3
Secret Key: XYZ86JBHHSD
Application Name: XYXZW4
Secret Key: XYZ86JBHHSD
Комментарии:
1. Попробуй
(?m)bApplication Name:s*(. )(?:(?!={3,}r?$)[wW])*^s*Secret Key:s*(. )
, увидишь regex101.com/r/e2mB15/2 , это будет работать, если каждый раздел разделен на 3 или более=
знаков. Разновидностью одного и того же регулярного выражения является(?m)bApplication Name:s*(. )(?:n(?!s*={3,}r?$).*)*^s*Secret Key:s*(. )
Ответ №1:
Для этого вам нужно использовать обходные пути.
/(?<=Application Name:)[^n]*(?=[^=]*(?=Secret Key))/g
Он фиксирует все между Application Name:
и n
если после того, как он Secret Key
появится перед =
символом.
Он также захватывает все space
символы. Если вам это не нужно и вы знаете точное количество пробелов, вы можете изменить его на
/(?<=Application Name:s{7})[^n]*(?=[^=]*(?=Secret Key))/g
7
это количество пропускаемых пробелов.
Обновить:
Чтобы также уловить Secret
изменение значения на
/(?<=Application Name:s{7})[^n]*(?=[^=]*(?=Secret Key))/g
Вам нужно обработать два совпадения подряд как пару Application Name
и Secret Key
.
Комментарии:
1. да, это работает, но вывод должен выглядеть так: Имя приложения: XYXZW3 Секретный ключ: XYZ86JBHHSD Имя приложения: XYXZW4 Секретный ключ: XYZ86JBHHSD
2. @Стив обновил ответ в соответствии с новым описанием
Ответ №2:
Я бы полагался на захват групп здесь:
(?m)bApplication Name:s*(. )(?:n(?!s*={3,}r?$).*)*^s*Secret Key:s*(. )
/bApplication Name:s*(. )(?:n(?!s*={3,}r?$).*)*^s*Secret Key:s*(. )/gm
Смотрите демонстрацию регулярных выражений. Подробные сведения:
bApplication Name:
— целое словоApplication
, пробел,Name,
:`s*
— ноль или более пробелов(. )
— Группа 1: один или несколько символов, отличных от символов разрыва строки, как можно больше(?:n(?!s*={3,}r?$).*)*
— любое количество строк, которые не начинаются с нуля или более пробелов, за которыми следуют три или более=
символов до конца строки (r?
добавляется здесь только в том случае, если вам придется иметь дело с регулярным выражением, где$
/m
флаг не совпадает перед символом CR, как в .NET)^
— начало строкиs*
— один или несколько пробеловSecret Key:
—Secret Key:
веревочкаs*
— ноль или более пробелов(. )
— Группа 2: один или несколько символов, отличных от символов разрыва строки, как можно больше
Ответ №3:
Вы можете использовать 2 группы захвата, если хотите получить значение для имени приложения и секретного ключа
^[p{Zs}t]*Application Name:[p{Zs}t]*(. )r?n[p{Zs}t]*Application Id:.*r?n[p{Zs}t]*Secret Key:[p{Zs}t]*(. )
Шаблон совпадает:
^
Начало строки[p{Zs}t]*
Сопоставьте необязательные символы горизонтальных пробеловApplication Name:[p{Zs}t]*
Сопоставьте имя приложения: и необязательные пробелы(. )
Группа захвата 1, значение для Имени приложенияr?n[p{Zs}t]*
Сопоставьте новую строку и необязательные пробелыApplication Id:.*r?n
Сопоставьте идентификатор приложения: и остальную часть строки[p{Zs}t]*Secret Key:[p{Zs}t]*
Совпадение секретного ключа: между необязательными пробелами(. )
Группа захвата 2, значение секретного ключа
Демонстрация регулярных выражений
Если вы хотите соответствовать значению имени приложения только в том случае, если присутствует секретный ключ, вы также можете использовать поисковые запросы для утверждения Application Name:
влево и Secret Key:
вправо, не пересекая линию, которая начинается по крайней мере с ==
(?<=^s*Application Name:s*)S.*(?=(?:r?n(?!s*==).*)*r?ns*Secret Key:)
<a rel=»noreferrer noopener nofollow» href=»https:///regexstorm.net/tester?p=(?Демонстрация регулярных выражений .NET