快速入门
教程
工具和语言
示例
参考
书评
正则表达式工具
grep
PowerGREP
RegexBuddy
RegexMagic
通用应用程序
EditPad Lite
EditPad Pro
语言和库
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
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于本网站
RSS Feed 和博客
RegexBuddy—The best regex editor and tester for PowerShell developers!

使用 PowerShell 的正则表达式

PowerShell 是 Microsoft 的一种编程语言,主要设计用于系统管理。PowerShell 构建在 .NET 之上,因此 .NET 出色的正则表达式支持 也可供 PowerShell 程序员使用。

以下讨论同样适用于 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,因为 \wtest 中匹配 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 枚举传递选项。相反,在正则表达式中使用模式修饰符。例如,(?m)^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 运算符。

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| 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 |