Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Краткое описание
Описывает регулярные выражения в 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