Сведения о регулярных выражениях
Краткое описание
Описание регулярных выражений в 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]
позволяет сопоставлять любое количество символов один раз, в то время как [^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 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 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$'
Примечание
При определении регулярного выражения, содержащего $
привязку, обязательно заключите регулярное выражение с помощью одинарных кавычек ('
) вместо двойных кавычек ("
) или PowerShell развернет выражение в виде переменной.
При использовании привязок в PowerShell следует понимать разницу между параметрами однострочного и многострочного регулярного выражения.
- Multiline: выполняет многострочный
^
режим и$
сопоставляет начало каждой строки, а не начало и конец входной строки. - Однострочный режим: однострочный режим обрабатывает входную строку как 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]::escape('3.\d{2,}')
3\.\\d\{2,}
Примечание
Это экранирует все зарезервированные символы регулярных выражений, включая существующие обратные косые черты, используемые в классах символов. Обязательно используйте его только в части шаблона, которую необходимо экранировать.
Экранирование других символов
Существуют также зарезервированные экраны символов, которые можно использовать для сопоставления специальных типов символов.
Ниже приведены несколько часто используемых escape-экранов символов:
Escape-символ | Описание |
---|---|
\t |
Соответствует вкладке |
\n |
Соответствует новой строке |
\r |
Соответствует возврату каретки |
Группы, записи и подстановки
Конструкции группирования разделяют входную строку на подстроки, которые можно записать или игнорировать. Сгруппированные подстроки называются вложенными выражениями. По умолчанию вложенные выражения записываются в нумерованных группах, хотя их также можно назначить.
Конструкция группировки — это регулярное выражение, окруженное круглыми скобками. Записывается любой текст, соответствующий заключенному регулярному выражению. В следующем примере входной текст разбивается на две группы записи.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Используйте автоматическую $Matches
переменную Hashtable для получения захваченного текста.
Текст, представляющий все совпадение, хранится в ключе 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 для имени и D для домена.
$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>
: выражение подстановки регулярного выражения для замены совпадений, найденных во входной строке.
Примечание
<substitute>
Операнды <original>
подчиняются правилам обработчика регулярных выражений, таким как экранирование символов.
Запись групп можно ссылаться в строке <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
Дополнительные сведения см. в разделе "Подстановки" в регулярных выражениях.