Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
Описывает регулярные выражения в PowerShell.
Длинное описание
Заметка
В этой статье показаны синтаксис и методы использования регулярных выражений в PowerShell. Он не охватывает все возможные выражения. Для более полного ознакомления см. Краткий справочник по языку регулярных выражений.
Регулярное выражение — это шаблон, используемый для сопоставления текста. Он может быть составлен из литеральных символов, операторов и других конструкций. PowerShell использует подсистему regex .NET.
В этой статье демонстрируется синтаксис регулярных выражений в PowerShell. PowerShell имеет несколько операторов и командлетов, которые используют регулярные выражения. Дополнительные сведения об их синтаксисе и использовании см. по ссылкам ниже.
- Select-String
- операторы -match и -replace
- оператор -split
- Оператор switch с параметром -regex
Регулярные выражения в 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'
Символы слов
Класс символов \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:
| Квантор | Описание |
|---|---|
* |
Ноль или больше раз. |
+ |
Один или несколько раз. |
? |
Ноль или один раз. |
{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 следует понимать разницу между однострочных и параметрами многострочного многострочного регулярных выражений.
-
Многострочный: многострочный режим заставляет
^и$соответствовать началу и концу каждой строки вместо начала и конца входной строки. -
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,}
Заметка
Это экранирует все зарезервированные символы регулярных выражений, включая существующие обратные очки, используемые в классах символов. Не забудьте использовать его только в той части шаблона, которую необходимо изолировать.
Другие экраны символов
Существуют также зарезервированные экранированные символы, которые можно использовать для сопоставления специальных символов.
Ниже приведены несколько часто используемых символов экранирования:
| Экранирование символов | Описание |
|---|---|
\t |
Соответствует вкладке |
\n |
Соответствует новой строке |
\r |
Соответствует возврату каретки |
Группы, записи и подстановки
Группирование конструкций отделяет входную строку в подстроки, которые можно записать или игнорировать. Сгруппированные подстроки называются вложенными выражениями. По умолчанию подвыражения записываются в нумерованных группах, хотя им также можно присваивать имена.
Конструкция группировки — это регулярное выражение, окруженное скобками. Записывается любой текст, соответствующий заключенному регулярному выражению. В следующем примере текст ввода разбивается на две группы записи.
'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True
Используйте автоматическую переменную $Matchesхеш-таблицы для получения захваченного текста.
Текст, представляющий весь матч, хранится по ключу 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хэш- автоматической переменной.
В группе захвата используйте ?<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...
Дополнительные сведения см. в разделе Группирование конструкций в регулярных выражениях.
Подстановки в регулярных выражениях
Использование регулярных выражений (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
Подробные сведения о подстановках в регулярных выражениях см. в Подстановках в регулярных выражениях.
Комментарии в регулярных выражениях
Регулярные выражения могут быть очень сложными и сложными для чтения. Вы можете использовать комментарии, чтобы сделать их более понятными. В регулярных выражениях разрешено два типа комментариев.
- Встроенный комментарий (
(?#)) - Комментарий в конце строки (
#)
Дополнительные сведения см. в разделе "примечания к регулярным выражениям" из "Обзор комментариев".
См. также
PowerShell