Как захватить определенную строку вокруг соответствия регулярному выражению в Windows PowerShell?

#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