当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于正则表达式

作者:精品下载站 日期:2024-12-14 02:19:25 浏览:14 分类:玩电脑

关于正则表达式


简短描述

描述 PowerShell 中的正则表达式。

详细描述

笔记

本文介绍在 PowerShell 中使用正则表达式的语法和方法。它没有涵盖所有可能的表达方式。有关更完整的参考,请参阅正则表达式语言 - 快速参考。

正则表达式是用于匹配文本的模式。它可以由文字字符、运算符和其他结构组成。

本文演示了 PowerShell 中的正则表达式语法。 PowerShell 有多个使用正则表达式的运算符和 cmdlet。您可以在下面的链接中阅读有关其语法和用法的更多信息。

  • Select-String
  • -匹配和-替换运算符
  • - 分割运算符
  • 带有 -regex 选项的 switch 语句

默认情况下,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}

匹配 nm 次。

# 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]::escape('3.\d{2,}')
3\.\d\{2,}

笔记

这会转义所有保留的正则表达式字符,包括字符类中使用的现有反斜杠。确保仅在需要转义的模式部分上使用它。

其他字符转义

还有保留的字符转义,可用于匹配特殊字符类型。

以下是一些常用的字符转义:

\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

捕获存储在从左到右递增的数字Integer键中。 Capture 1 包含用户名之前的所有文本,capture 2 仅包含用户名。

$Matches
Name           Value
----           -----
2              CONTOSO\jsmith
1              The last logged on user was
0              The last logged on user was CONTOSO\jsmith

这很重要

0 键是一个整数。您可以使用任何哈希表方法来访问存储的值。

PS> 'Good Dog' -match 'Dog'
True

PS> $Matches[0]
Dog

PS> $Matches.Item(0)
Dog

PS> $Matches.0
Dog

命名捕获

默认情况下,捕获按从左到右的升序数字顺序存储。您还可以为捕获组分配名称。此名称成为$Matches Hashtable自动变量上的键。

在捕获组内,使用 ?

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯