Разное

Powershell regex: о регулярных выражениях — PowerShell

04.08.1974

Содержание

о регулярных выражениях — PowerShell

  • Чтение занимает 7 мин

В этой статье

Краткое описание

Описание регулярных выражений в PowerShell.

Подробное описание

Примечание

В этой статье мы покажем синтаксис и методы использования регулярных выражений в PowerShell, но не все описанные выше синтаксисы. Более полный справочник см. в разделе Справочник по языку регулярных выражений.

Регулярное выражение — это шаблон, используемый для сопоставления текста. Он может состоять из литеральных символов, операторов и других конструкций.

В этой статье демонстрируется синтаксис регулярных выражений в PowerShell. PowerShell имеет несколько операторов и командлетов, использующих регулярные выражения. Дополнительные сведения о синтаксисе и использовании см. по ссылкам ниже.

По умолчанию регулярные выражения PowerShell не учитывают регистр. Каждый приведенный выше метод имеет другой способ принудительного учета регистра.

Метод Чувствительность к регистру
Select-String использовать -CaseSensitive параметр
инструкция switch Используйте -casesensitive параметр
операторы Добавить префикс с «c» ( -cmatch , -csplit или -creplace )

Символьные литералы

Регулярное выражение может быть литеральным символом или строкой. Выражение приводит к тому, что подсистема сопоставляет текст, указанный в точности.

# This statement returns true because book contains the string "oo"
'book' -match 'oo'

Категории знаков

Хотя символьные литералы работают, если вам известно точное шаблон, классы символов позволяют быть менее конкретными. character group] только символы, не находящиеся в группе.

# This expression returns true if the pattern matches big, bog, or bug.
'big' -match 'b[iou]g'

Если список символов для сопоставления содержит символ дефиса ( - ), он должен находиться в начале или в конце списка, чтобы отличать его от выражения диапазона символов.

Диапазоны символов

Шаблон также может быть диапазоном символов. Символы могут быть алфавитными [A-Z] , числовыми [0-9] или даже основанными на ASCII [ -~] (все печатные символы).

# This expression returns true if the pattern matches any 2 digit number.
42 -match '[0-9][0-9]'
Числа

\dКласс символов будет соответствовать любой десятичной цифре. И наоборот, \D будет соответствовать любой цифре, отличной от десятичной.

# This expression returns true if it matches a server name.
# (Server-01 - Server-99). 
'Server-01' -match 'Server-\d\d'
Символы слов

\wКласс символов будет соответствовать любому символу слова [a-zA-Z_0-9] . Для соответствия любому символу, не являющемуся буквой, используйте \W .

# This expression returns true.
# The pattern matches the first word character 'B'.
'Book' -match '\w'
подстановочные знаки;

Точка (

. ) является символом-шаблоном в регулярных выражениях. Он будет соответствовать любому символу, кроме новой строки ( \n ).

# This expression returns true.
# The pattern matches any 4 characters except the newline.
'a1\ ' -match '....'
Пробелы

Пробелы сопоставляются с помощью \s класса символов. Все символы, отличные от пробельных, сопоставляются с помощью \S . Также можно использовать символы пространства литерала ' ' .

# This expression returns true. 
# The pattern uses both methods to match the space.
' - ' -match '\s- '

Квантификаторы

Кванторы контролируют, сколько экземпляров каждого элемента должно присутствовать во входной строке.

Ниже перечислены некоторые кванторы, доступные в PowerShell.

Квантификатор Описание
* Ноль или более раз.
+ Один или несколько раз.
? Ноль или один раз.
{n,m} Как минимум n , но не более m раз.

Звездочка ( * ) соответствует предыдущему элементу ноль или более раз. Результатом является то, что даже входная строка без элемента будет совпадать.

# This returns true for all account name strings even if the name is absent.
'ACCOUNT NAME:    Administrator' -match 'ACCOUNT NAME:\s*\w*'

Знак «плюс» ( + ) соответствует предыдущему элементу один или более раз.

# This returns true if it matches any server name.
'DC-01' -match '[A-Z]+-\d\d'

Вопросительный знак ? соответствует предыдущему элементу ноль или один раз. Как и звездочка * , она даже будет сопоставлять строки, в которых отсутствует элемент.

# This returns true for any server name, even server names without dashes.
'SERVER01' -match '[A-Z]+-?\d\d'

{n, m}Квантификатор можно использовать несколькими различными способами, чтобы обеспечить детальный контроль над квантификатором. Второй элемент m и запятая , являются необязательными.

Квантификатор Описание
{n} Совпадение ровно n число раз.
{n,} Совпадение по КРАЙНЕй мере с
n
числом раз.
{n,m} Совпадение между n и m числом раз. $|?*+{} .

Эти символы в шаблонах необходимо экранировановать, чтобы они совпадали с ними во входных строках.

# This returns true and matches numbers with at least 2 digits of precision.
# The decimal point is escaped using the backslash.
'3.141' -match '3\.\d{2,}'

Существует статический метод класса Regex, который может поэкранировать текст.

[regex]::escape('3.\d{2,}')
3\.\\d\{2,}

Примечание

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

Другие escape-символы

Существуют также зарезервированные escape-символы, которые можно использовать для сопоставления специальных символьных типов.

Ниже приведены несколько часто используемых escape-символов:

Escape-последовательность символов Описание
\t Соответствует символу табуляции
\n Соответствует символу новой строки
\r Соответствует символу возврата каретки

Группы, записи и подстановки

Конструкции группирования разделяют входную строку на подстроки, которые можно записывать или игнорировать. Сгруппированные подстроки называются частью выражения. По умолчанию части выражения фиксируются в нумерованных группах, но также можно назначать им имена.

Конструкция группирования — это регулярное выражение, заключенное в круглые скобки. Захватывается любой текст, совпадающий с вложенным регулярным выражением. В следующем примере входной текст будет разбиваться на две группы записи.

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

Используйте $Matches автоматическую переменную Hashtable для получения захваченного текста. Текст, представляющий полное совпадение, хранится в разделе Key 0 .

$Matches.0
The last logged on user was CONTOSO\jsmith

Записи хранятся в числовых целочисленных ключах, которые увеличиваются слева направо. Запись

1 содержит весь текст до имени пользователя, а запись 2 содержит только имя пользователя.

$Matches
Name                           Value
----                           -----
2                              CONTOSO\jsmith
1                              The last logged on user was
0                              The last logged on user was CONTOSO\jsmith

Важно!

0Ключ является целым числом. Для доступа к сохраненному значению можно использовать любой метод Hashtable .

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog
Именованные записи

По умолчанию записи хранятся в возрастающем числовом порядке, слева направо. Можно также присвоить

имя захваченной группе. Это имя станет ключом в $Matches автоматической переменной Hashtable .

Внутри захваченной группы используйте ?<keyname> для хранения захваченных данных с именованным ключом.

PS> $string = 'The last logged on user was CONTOSO\jsmith'
PS> $string -match 'was (?<domain>.+)\\(?<user>.+)'
True

PS> $Matches

Name                           Value
----                           -----
domain                         CONTOSO
user                           jsmith
0                              was CONTOSO\jsmith

PS> $Matches.domain
CONTOSO

PS> $Matches.user
jsmith

в следующем примере в журнал Безопасность Windows сохраняется самая новая запись журнала. Указанное регулярное выражение извлекает имя пользователя и домен из сообщения и сохраняет их в ключах:

N для Name и D для domain.

$log = (Get-WinEvent -LogName Security -MaxEvents 1).message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True
$Matches
Name                           Value
----                           -----
D                              CONTOSO
N                              jsmith
0                              A process has exited. ...

Дополнительные сведения см. в разделе конструкции группирования в регулярных выражениях.

Подстановки в регулярных выражениях

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

-replace оператором позволяет динамически заменять текст с помощью захваченного текста.

<input> -replace <original>, <substitute>

  • <input>: Искомая строка
  • <original>: Регулярное выражение, используемое для поиска во входной строке
  • <substitute>: Выражение подстановки регулярного выражения для замены совпадений, обнаруженных во входной строке.

Примечание

<original> <substitute> Операнды и подчиняются правилам обработчика регулярных выражений, таких как Экранирование символов.

В строке можно ссылаться на захваченные группы <substitute> . Подстановка выполняется с помощью $ символа перед идентификатором группы.

Существуют два способа ссылки на группы записи по числу и имени.

  • По числу групп записи нумеруются слева направо.

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '[email protected]'
    
    [email protected]
    
  • По именам групп также можно ссылаться по имени.

    'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
    
    FABRIKAM\Administrator
    

$&Выражение представляет весь текст, соответствующий.

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

Предупреждение

Поскольку $ символ используется в расширении строки, необходимо использовать литеральные строки с подстановкой или Escape- $ символ при использовании двойных кавычек.

'Hello World' -replace '(\w+) \w+', '$1 Universe'
"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe
Hello Universe

Кроме того, если требуется $ использовать в качестве литерального символа, используйте $$ вместо обычных escape-символов. \S+\s+\S+)(\s+)(CONTACT:)(\s+)(\S+)’ $Matches[1]

Но если строка изменится на что-то вроде этого, без пробелов

CUSTOMERNAME            CONTACT:  MB

совпадение-это ложь.

Как я могу сделать regex, который захватывает первую часть строки независимо от ее длины или символов?

Вероятно, это было не очень ясно. Ценности, которые я ищу, таковы:

$Matches[1] — в приведенном выше будет синим происхождением

$Matches[3] — CONTACT:

$Matches[5] — MB

regex powershell
Поделиться Источник Eric     13 декабря 2018 в 18:29

4 ответа


  • Powershell использование Regex поиск строки внутри строки

    Нужна помощь в использовании regex и powershell для выполнения следующих действий. У меня есть следующий пример строки: <INPUT TYPE=hidden NAME=site2pstoretoken VALUE=v1. 2~04C40A77~23\><INPUT TYPE=hidden NAME=p_error_code VALUE=> Единственное, что я хочу извлечь из этой строки примера,…

  • Regex двоичный файл с GC в PowerShell

    Вопрос: какой шаблон PowerShell regex вернет вывод, подобный Строковой команде Bash? Я нашел статью о gc и Select-String: Episode #137: Free-base64-ing. http://blog.commandlinekungfu.com/2011/03/эпизод-137-бесплатно-base64-ing.html Я попробовал несколько шаблонов regex из предыдущего вопроса:…



3

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

$s = 'BLUE ORIGIN             CONTACT:  MB'
$s -match 'CONTACT:\s+(\S+)'
$Matches

Выход:

Name                           Value
----                           -----
1                              MB
0                              CONTACT:  MB

(Таким образом, вы можете просто сделать $Matches[1] , чтобы получить именно то значение, которое вам нужно. (.*?)\s*(CONTACT:)\s+(\S+)’|Out-Null $matches | ft -AutoSize Name Value —- —— 3 MB 2 CONTACT: 1 CUSTOMERNAME 0 CUSTOMERNAME CONTACT: MB

Поделиться Unknown     13 декабря 2018 в 19:13



1

В соответствии с предоставленными данными это сделает работу за вас

[A-Za-z\s]+CONTACT:\s+\S+

Объяснение

  • [A-Za-z\s]+ — Соответствует любому алфавиту или пространству один или несколько раз.
  • CONTACT: — Соответствует CONTACT: .
  • \s+ — Соответствует одному или нескольким символам пробела.
  • \S+ — Соответствует одному или нескольким символам без пробела.

Демонстрация

Поделиться Code Maniac     13 декабря 2018 в 18:35


  • regex выберите все строки, кроме строки в конце

    Я хочу, чтобы regex выбрал всю строку, кроме html строки до конца , или выбрал полную строку, если html не найден для example:this строки yurry/nova-gta-flowers-html-html. StartofString…


    Удалить часть строки с regex

    Я пытаюсь снять часть строки (которая, оказывается, является url) с Regex. Я становлюсь лучше из regex, но не могу понять, как сказать ему, что содержимое до или после строки является…


    Powershell использование Regex поиск строки внутри строки

    Нужна помощь в использовании regex и powershell для выполнения следующих действий. У меня есть следующий пример строки: <INPUT TYPE=hidden NAME=site2pstoretoken…


    Regex двоичный файл с GC в PowerShell

    Вопрос: какой шаблон PowerShell regex вернет вывод, подобный Строковой команде Bash? Я нашел статью о gc и Select-String: Episode #137: Free-base64-ing….


    regex выберите все строки, кроме строки в конце

    Я хочу, чтобы regex выбрал всю строку, кроме html строки до конца , или выбрал полную строку, если html не найден для example:this строки yurry/nova-gta-flowers-html-html.html или.. .


    Как отфильтровать часть строки с помощью regex?

    Используя PowerShell, я могу получить строки из файла, которые содержат необходимый текст: Get-ChildItem -recurse -Attributes !Directory+!System | Get-Content | Select-String tshtml Это дает…


    Notepad++ Regex для сопоставления строки

    Каков наилучший способ сопоставить что-то на основе места строки? Например: Name — Date — OtherName, DiffrentName — ID — RandomText1 — RandomText2 Я хочу, чтобы regex сделал что — то вроде: выберите…


    Powershell отбросьте последнюю часть строки с кратным «.»

    Я пытаюсь сделать выражение regex в powershell, чтобы получить только определенную часть строки. Я знаю способ, которым я могу сделать это без regex, но он определенно может быть более эффективным….


    Извлечение подстроки в powershell с помощью regex

    У меня есть строка в excel, из которой мне нужно извлечь подстроку Это пример строки: <\Text Name=Text5><TextValue>Hostname: hostnamehere</TextValue> Я новичок в regex и. ..

    Использование | in PowerShell regex



    Я пытаюсь разделить некоторый текст с помощью PowerShell, и я немного экспериментирую с regex, и я хотел бы точно знать, что делает символ «|» в PowerShell regex. Например, у меня есть следующая строка кода:

    "[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png" | select-string '\[\d+\]:' | foreach-object {($_ -split '\[|\]')}
    

    Запуск этой строки кода дает мне следующий вывод:

    -blank line-
    02
    : ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png
    

    Если я запускаю код без «|» в операторе-split как таковом:

    "[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png" | select-string '\[\d+\]:' | foreach-object {($_ -split '\[\]')}
    

    Я получаю следующий вывод без удаления [] (по сути, это просто отображение вывода select-string:

    [02]: . /media/active-directory-dotnet-how-to-use-access-control/acs-01.png
    

    Если я изменю код и запущу его вот так:

    "[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png" | select-string '\[\d+\]:' | foreach-object {($_ -split '\[|')}
    

    В выводе [ зачищается с самого начала, но вывод имеет возврат каретки после каждого символа (я не включил полный вывод для целей пробела).

    0
    2
    ]
    :
    
    .
    /
    m
    e
    
    regex powershell
    Поделиться Источник DBS     29 января 2015 в 21:03

    3 ответа


    • Как получить Hello «Newline» и World in powershell с помощью regex?

      Как получить Hello “Newline” и World in powershell с помощью regex? Hello World Я должен получить Hello World из текстового файла. Я использую powershell.

    • Powershell совместимость regex ароматы

      Я тестирую в Powershell, некоторые regex, которые я получаю из программы, написанной на другом языке. Но regex не работает должным образом, я знаю, что в зависимости от вкуса regex, как PCRE,POSIX. regex интерпретируется по-разному. Мой вопрос заключается в том, каковы совместимые ароматы regex…


    Поделиться Walter Mitty     29 января 2015 в 21:09



    1

    Ответы уже объясняют, для чего предназначен | , но я хотел бы объяснить, что происходит с каждым примером, приведенным выше.

    1. -split '\[|\]': You are trying to match either [ or ] which is why you get 3 results. The first being a blank line which is the whitespace represented by the beginning of the line before the first [

    2. -split '\[\]' : Поскольку в этом примере вы опускаете символ | , вы просите разделить последовательность символов [] , которая не отображается в вашей строке. Это контрастирует с кодом $_.split('\[\]') , который будет разделяться на каждый символ. Это сделано специально.

    3. -split '\[|' : Здесь вы сталкиваетесь с оговоркой, что не указываете правый операнд для оператора | . Чтобы процитировать справку из Regex101 , когда указано это regex:

    (null, соответствует любой позиции)

    Предупреждение: Пустая альтернатива эффективно усекает regex в этот момент, потому что она всегда найдет совпадение нулевой ширины

    Вот почему последний пример разбит на каждый элемент. Кроме того, я не думаю, что все это только PowerShell. Такое поведение следует наблюдать и на других движках.

    Поделиться Matt     29 января 2015 в 21:45



    0

    Уолтер Митти прав, | — для чередования.

    Вы также можете использовать [Regex]::Escape("string") в Powershell, и он вернет строку со всеми экранированными специальными символами. (?!7725_1|\Dealer).*\r\n Заменять: При этом удаляются все строки, которые не начинаются ни с 7725_1, ни с Dealer. Я перепробовал…


Похожие вопросы:


Powershell regex отказ работать на нескольких линиях

У меня есть regex, который возвращает правильные результаты, когда я использую различные онлайн-тестовые сайты regex. Однако когда я использую regex в скрипте PowerShell, он возвращает только одну…


Powershell использование Regex поиск строки внутри строки

Нужна помощь в использовании regex и powershell для выполнения следующих действий. У меня есть следующий пример строки: <INPUT TYPE=hidden NAME=site2pstoretoken…


Powershell regex

Есть ли команда Powershell regex, которую я мог бы использовать для замены последнего последовательного нуля в текстовой строке на M? например: $Pattern = @(000123456, 012345678, 000000001,…


Как получить Hello «Newline» и World in powershell с помощью regex?

Как получить Hello “Newline” и World in powershell с помощью regex? Hello World Я должен получить Hello World из текстового файла. (?!7725_1|\Dealer).*\r\n…


Многострочный Regex Lookbehind Failing in Powershell

Я пытаюсь разобрать конкретный текстовый файл. Одна часть файла такова: Installed HotFix n/a Internet Explorer — 0 Applications: В powershell это в настоящее время находится в файле…


Powershell 5.1: как перебирать файлы параллельно

Мне нужно скопировать файлы, зависящие от содержимого. Так я вам все файлы, ознакомьтесь с содержанием и попросить regex, если это действительно. После этого я хочу скопировать файл в определенный…


Powershell Regex заменить подчеркивания дефисами

Я пытаюсь найти команду powershell для поиска всех файлов в каталоге и замены любых подчеркиваний дефисами только в относительных ссылках (ссылка не может начинаться с http). Вот вам пример: <a…

regex — PowerShell Извлечение текста из строки

Я действительно ужасен, когда дело доходит до Regex и застрял на некоторое время. Как я могу получить Персона A из следующей строки?

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum<br>
Affected: Lorem<br>
Duty Officer: Person A<br>
Affected: Ipsum

Заранее спасибо!

0

Ayush Lal 28 Май 2020 в 03:11

3 ответа

Лучший ответ

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

^Duty Officer: ([\w ]+)$

Объяснение указанного выше регулярного выражения:

^ . Duty Officer: ([\w ]+)$’ PS C:\Path\To\MyDesktop> select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches.groups[1] } | % { $_.Value } > $output_file

Приведенный выше результат берет входные данные, предоставленные вами через файл test.txt , и печатает нужный вывод в файле testResult.txt . Обратите внимание на команду select-string, чтобы захватить только группу 1, которую я использовал $_.Matches.groups[1].

Для лучшего понимания команд, использованных выше; см. здесь. а>

2

Mandy8055 28 Май 2020 в 04:35

Вы можете получить определенную часть текста с помощью индексации. Это более широко известно как функция подстроки в powershell. Вы также можете использовать функцию split, если хотите указать символ для разделения текста.

$string_to_convert = "Duty Officer: Person A"
$string_to_convert.Substring(14,22)
>>> "Person A"
$string_to_convert = "Duty Officer: Person A"
$string_to_convert.Split(" ")[2]
>>> "Person A"

0

Joshua Rose 28 Май 2020 в 00:24

Вот еще один метод. Предполагается, что данные представляют собой ОДНУ многострочную строку и что в эту строку включен только один блок целевого текста.

Что оно делает …

  • строит многострочную строку для работы
  • устанавливает префикс для разделения на
  • устанавливает суффикс для разделения на
  • разбивает на префикс
  • захватывает последний элемент в результирующем массиве
  • разбивает суффикс
  • захватывает первый элемент в этом массиве
  • удаляет любые начальные или конечные пробелы
  • присваивает значение переменной $ Var
  • отображает это значение

Код . ..

# this presumes the data is ONE multiline string
#     and that there are no other blocks of data in the string
$InStuff = @'
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum<br>
Affected: Lorem<br>
Duty Officer: Person A<br>
Affected: Ipsum
'@

$Prefix = 'Duty Officer:'
$Suffix = '<br>'

$DutyOfficer = (($InStuff -split $Prefix)[-1] -split $Suffix)[0].Trim()

$DutyOfficer

Выход = Person A

1

Lee_Dailey 28 Май 2020 в 13:00

о регулярных выражениях — PowerShell