Сведения о регулярных выражениях
Краткое описание
Описывает регулярные выражения в PowerShell.
Подробное описание
Примечание
В этой статье описаны синтаксис и методы использования регулярных выражений в PowerShell. Здесь рассматриваются не все синтаксисы. Более полный справочник см. в кратком справочнике по языку регулярных выражений.
Регулярное выражение — это шаблон, используемый для сопоставления текста. Он может быть составлен из литеральных символов, операторов и других конструкций.
В этой статье демонстрируется синтаксис регулярных выражений в PowerShell. В PowerShell есть несколько операторов и командлетов, использующих регулярные выражения. Дополнительные сведения о синтаксисе и использовании см. по ссылкам ниже.
Регулярные выражения PowerShell по умолчанию не учитывают регистр. Каждый метод, показанный выше, имеет свой способ принудительной чувствительности регистра.
Метод | Чувствительность к регистру |
---|---|
Select-String |
параметр use -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 'h' to be followed by the end of the word.
# This will return FALSE.
"fishing" -match "^fish$"
При использовании привязок в PowerShell следует понимать разницу между параметрами однострочного и многострочного регулярных выражений.
- Многострочный режим. В многострочном режиме выполняется
^
принудительное совпадение с$
начальным концом каждой строки LINE вместо начала и конца входной строки. - 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]::escape("3.\d{2,}")
3\.\\d\{2,}
Примечание
Это экранирует все зарезервированные символы регулярного выражения, включая существующие обратные косые черты, используемые в классах символов. Обязательно используйте его только в той части шаблона, которую необходимо экранировать.
Другие escape-символы
Существуют также зарезервированные 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
В следующем примере сохраняется последняя версия SuccessAudit из журнала Безопасность 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....
Дополнительные сведения см. в разделе Конструкции группирования в регулярных выражениях.
Подстановки в регулярных выражениях
Использование регулярных выражений с оператором -replace
позволяет динамически заменять текст захваченным текстом. На записи групп можно ссылаться в подстановочной> строке<. Подстановка выполняется с помощью символа $
перед идентификатором группы.
<input> -replace <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 Universe
Кроме того, так как $
символ используется при подстановке, вам потребуется экранировать все экземпляры в строке.
'5.72' -replace '(.+)', '$$$1'
$5.72
Дополнительные сведения см. в разделе Подстановки в регулярных выражениях.