正则表达式工具 |
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 和博客 |
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 版本之间没有差异。
使用 -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 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()。
要使用 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 |
页面 URL:https://regexper.cn/powershell.html
页面上次更新时间:2021 年 11 月 5 日
网站上次更新时间:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。