用法 |在PowerShell正则表达式中



我正在尝试使用PowerShell拆分一些文本,并且正在对正则表达式进行一些实验,我想知道"|"字符在PowerShell正则表达式中到底做了什么。例如,我有以下代码行:

"[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png" | select-string '[d+]:' | foreach-object {($_ -split '[|]')}

运行这行代码给我以下输出:

-blank line-
02
: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png

如果我在 -split 语句中运行没有"|"的代码,如下所示:

"[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png" | select-string '[d+]:' | foreach-object {($_ -split '[]')}

我得到以下输出而没有剥离 [](本质上它只是显示选择字符串输出:

[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png

如果我修改代码并像这样运行它:

"[02]: ./media/active-directory-dotnet-how-to-use-access-control/acs-01.png" | select-string '[d+]:' | foreach-object {($_ -split '[|')}

在输出中,[从一开始就被剥离,但输出在每个字符之后都有一个回车符(出于空格目的,我没有包括完整的输出)。

0
2
]
:
.
/
m
e

管道字符"|"在正则表达式中分隔替代项。

您可以在此处看到定义的所有元字符:http://regexlib.com/CheatSheet.aspx?AspxAutoDetectCookieSupport=1

答案已经解释了|的用途,但我想解释一下您上面每个示例的情况。

  1. -split '[|]' : 您正在尝试匹配[]这就是为什么您得到 3 个结果的原因。第一个是空行,它是第一个[之前的行首表示的空格

  2. -split '[]' :由于您在此示例中省略了|符号,因此您请求拆分字符串中未出现的字符序列[]。这与代码$_.split('[]')形成鲜明对比,代码将拆分为每个字符。这是设计使然。

  3. -split '[|' :在这里,您遇到了一个警告,即没有为|运算符指定右侧操作数。在指定此正则表达式时引用 Regex101 的帮助:

(空,匹配任何位置)

警告:空的替代项有效地截断了正则表达式 点,因为它将始终找到零宽度匹配项

这就是为什么最后一个示例在每个元素上拆分的原因。另外,我不认为这些只是PowerShell。在其他引擎上也应该看到此行为。

Walter Mitty是正确的,|用于交替。

您还可以在 Powershell 中使用 [Regex]::Escape("string"),它将返回一个字符串,其中包含所有特殊字符的转义。因此,您可以在要从字面上匹配的任何字符串上使用它(或确定特定字符在正则表达式中是否具有或可以具有特殊含义)。

最新更新