正则表达式工具 |
grep |
语言和函数库 |
Boost |
Delphi |
GNU (Linux) |
Groovy |
Java |
JavaScript |
.NET |
PCRE (C/C++) |
PCRE2 (C/C++) |
Perl |
PHP |
POSIX |
PowerShell |
Python |
R |
Ruby |
std::regex |
Tcl |
VBScript |
Visual Basic 6 |
wxWidgets |
XML Schema |
Xojo |
XQuery 和 XPath |
XRegExp |
数据库 |
MySQL |
Oracle |
PostgreSQL |
更多内容 |
简介 |
正则表达式快速入门 |
正则表达式教程 |
替换字符串教程 |
应用程序和语言 |
正则表达式范例 |
正则表达式参考 |
替换字符串参考 |
PowerShell 中的正则表达式
PowerShell 是 Microsoft 的编程语言,主要设计用于系统管理。PowerShell 创建在 .NET 之上,因此 PowerShell 程序员也可以使用 .NET 出色的正则表达式支持。
以下讨论同样适用于 Windows PowerShell 1.0 到 5.1、PowerShell Core 6 和 PowerShell 7。自 .NET 2.0 之后,.NET 或 .NET Core 中的正则表达式语法并未有任何变更。PowerShell 1.0 在 .NET 2.0 之后发布。因此,所有版本的 PowerShell 都使用相同的正则表达式语法。Windows PowerShell 2.0 和 5.0 添加了一些功能,让分割字符串和调用其他 Regex() 构造函数变得更容易。除此之外,在使用正则表达式方面,所有 PowerShell 版本之间没有任何差异。
PowerShell -Match 和 -Replace 营运子
使用 -match
营运子,您可以快速检查正则表达式是否与字符串的一部分相符。例如,'test' -match '\w'
会传回 true,因为 \w
与 test
中的 t
相符。
作为副作用,-match
营运子会设置一个称为 $matches
的特殊变量。这是一个关联数组,用于保存整体正则表达式相符项和所有捕获组相符项。$matches[0]
会提供您整体正则表达式相符项,$matches[1]
会提供第一个捕获组,而 $matches['name']
会提供由命名组「name」相符的文本。
-replace
营运子使用正则表达式在字符串中进行搜索和取代。例如,'test' -replace '\w', '$&$&'
会传回 'tteesstt'
。正则表达式 \w
会相符一个字母。取代文本会使用 $&
两次重新插入正则表达式相符项。必须指定取代文本参数,并且正则表达式和取代项必须以逗号分隔。如果您要将正则表达式相符项取代为空白,请传递一个空白字符串作为取代项。
传统上,正则表达式缺省会区分大小写。.NET 架构也是如此。不过,PowerShell 中并非如此。-match
和 -replace
不区分大小写,-imatch
和 -ireplace
也是如此。对于区分大小写的相符项,请使用 -cmatch
和 -creplace
。我建议您始终使用「i」或「c」前缀,以避免对大小写敏感性感到困惑。
操作符不提供传递 .NET 的 RegexOptions 枚举选项的方法。请改用正则表达式中的模式修改器。例如 ^test$
等同于将 RegexOptions.MultiLine 传递给 Regex() 构造函数,并使用 ^test$
。模式修改器优先于外部设置的正则表达式选项。-cmatch '(?i)test'
不分大小写,而 -imatch '(?-i)test'
则区分大小写。模式修改器会覆写 -match
操作符的不区分大小写偏好设置。
PowerShell -Split 操作符
PowerShell 2.0(随 Windows 7 SP1 推出)添加了 -split
操作符。它允许您沿着正则表达式比对来分割字符串。例如 $subject -split "\W+"
会沿着非字符字符来分割主旨字符串,因此会传回字符串中所有字词的数组。
替换文本作为字面字符串
-replace
操作符支持与 .NET 中的 Regex.Replace() 函数相同的替换文本占位符。$&
是整体正则表达式比对,$1
是由第一个捕获组比对的文本,而 ${name}
是由命名组「name」比对的文本。
但在 PowerShell 中,有一个额外的注意事项:双引号字符串使用美元语法进行变量内插。变量内插会在 Regex.Replace() 函数(-replace
在内部使用)解析替换文本之前完成。与 Perl 不同,$1
在 PowerShell 中并非神奇变量。该语法仅在替换文本中有效。-replace
操作符也不会设置 $matches
变量。因此 'test' -replace '(\w)(\w)', "$2$1"
(双引号替换)会传回空字符串(假设您未在先前的 PowerShell 代码中设置变量 $1 和 $2)。由于变量内插,Replace() 函数永远不会看到 $2$1
。若要让 Replace() 函数取代其占位符,请使用 'test' -replace '(\w)(\w)', '$2$1'
(单引号替换)或 'test' -replace '(\w)(\w)', "`$2`$1"
(美元符号以反引号转义),以确保 $2$1
会以字面形式传递给 Regex.Replace()。
使用 System.Text.RegularExpressions.Regex 类别
若要使用 PowerShell 的所有 .NET 正规表达式处理功能,请通过实例化 System.Text.RegularExpressions.Regex 类别来创建正规表达式对象。如果您想要使用 Regex() 构造函数,它会将字符串视为唯一参数,而正规表达式则会编译,PowerShell 会提供一个便利的捷径。 $regex = [regex] '\W+'
编译正规表达式 \W+
(与一个或多个非字符元匹配)并将结果保存在变量 $regex
中。您现在可以在 $regex
对象上调用 Regex 类别的所有方法。
在 PowerShell 5.0 及更新版本中,您可以在类别名称上调用另一个 Regex() 构造函数
using namespace System.Text.RegularExpressions $regex = [Regex]::new('^test$', [RegexOptions]::MultiLine)
在旧版本的 PowerShell 中,您必须使用 PowerShell 的 new-object
cmdlet。例如,若要设置 RegexOptions.MultiLine 旗标,您需要这行代码
$regex = new-object System.Text.RegularExpressions.Regex ('^test$', [System.Text.RegularExpressions.RegexOptions]::MultiLine)
在任何版本的 PowerShell 中,正规表达式内的 模式修改器 都可以提供更简短的解决方案
$regex = [regex] '(?m)^test$'
模式修改器也可以与 -match
、-replace
和 -split
营运子搭配使用。