Поделиться через


about_Regular_Expressions

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

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

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

Примечание.

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

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

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

Регулярные выражения PowerShell по умолчанию не учитывает регистр. Каждый метод, показанный выше, имеет другой способ принудительной конфиденциальности регистра.

  • Для Select-Stringэтого используйте параметр CaseSensitive .
  • Для операторов, использующих регулярные выражения, используйте версию с учетом регистра: -cmatch, -creplaceили -csplit
  • Для инструкции switch -casesensitive используйте параметр

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

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

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

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

Хотя литералы символов работают, если вы знаете точный шаблон, классы символов позволяют быть менее конкретными.

Группы символов

[character group] позволяет сопоставлять любое количество символов один раз, а [^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'

Символы Word

Класс \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 the whitespace character class to match the leading
# space and a literal space to matching the trailing space.
' - ' -match '\s- '

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

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

Ниже приведены некоторые квантификаторы, доступные в PowerShell:

Квантификатор Description
* Ноль или больше раз.
+ Один или несколько раз.
? Ноль или один раз.
{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 , являются необязательными.

Квантификатор Description
{n} n Точное количество раз.
{n,} Совпадение по крайней мере n количества раз.
{n,m} Совпадение между n и m числом раз.
# This returns true if it matches any phone number.
'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Привязки

Привязки позволяют привести к успешному или неудачном совпадению на основе позиции совпадений в входной строке.

Два часто используемых привязки: ^ и $. ^ Курсор соответствует началу строки и $, которая соответствует концу строки. Привязки позволяют сопоставлять текст по определенной позиции, а также удалять нежелательные символы.

# The pattern expects the string 'fish' to be the only thing on the line.
# This returns FALSE.
'fishing' -match '^fish$'

Примечание.

При определении regex, содержащего привязку ($ ), следует заключить regex в одинарные кавычки ('). Если вы используете двойные кавычки ("), PowerShell интерпретирует строку как расширяемое выражение переменной.

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

  • Многострочный режим: выполняется многострочный ^ режим и $ соответствует началу каждой строки, а не к началу и концу входной строки.
  • Singleline: режим singleline обрабатывает входную строку как singleLine. Он заставляет . символ соответствовать каждому символу (включая новые линии), а не сопоставлять каждый символ, КРОМЕ новой строки \n.

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

Экранирование символов

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

Зарезервированы следующие символы: []().\^$|?*+{}

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

# 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,}

Примечание.

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

Другие экраны символов

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

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

Экранирование символов Description
\t Соответствует вкладке
\n Соответствует новой строке
\r Соответствует возврату каретки

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

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

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

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

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

$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 для имени и D для домена.

$log = (Get-EventLog -LogName Security -Newest 1 -InstanceId 4689).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....

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

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

Использование регулярных выражений (regex) с -replace оператором позволяет динамически заменить текст с помощью записанного текста.

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

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

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

Группы записи можно ссылаться в строке <substitute> , используя $ символ перед идентификатором группы.

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

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

    'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
    
    John.D.Smith@contoso.com
    
  • По имени — группы отслеживания также можно ссылаться по имени.

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

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

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

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

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

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

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

'5.72' -replace '(.+)', '$$$1'
"5.72" -replace "(.+)", "`$`$`$1"
$5.72
$5.72

Подробные сведения о выражениях подстановки см. в разделе "Подстановки" в регулярных выражениях.

См. также