我正在尝试使用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
答案已经解释了|
的用途,但我想解释一下您上面每个示例的情况。
-
-split '[|]'
: 您正在尝试匹配[
或]
这就是为什么您得到 3 个结果的原因。第一个是空行,它是第一个[
之前的行首表示的空格 -
-split '[]'
:由于您在此示例中省略了|
符号,因此您请求拆分字符串中未出现的字符序列[]
。这与代码$_.split('[]')
形成鲜明对比,代码将拆分为每个字符。这是设计使然。 -
-split '[|'
:在这里,您遇到了一个警告,即没有为|
运算符指定右侧操作数。在指定此正则表达式时引用 Regex101 的帮助:
(空,匹配任何位置)
警告:空的替代项有效地截断了正则表达式 点,因为它将始终找到零宽度匹配项
这就是为什么最后一个示例在每个元素上拆分的原因。另外,我不认为这些只是PowerShell。在其他引擎上也应该看到此行为。
Walter Mitty是正确的,|
用于交替。
您还可以在 Powershell 中使用 [Regex]::Escape("string")
,它将返回一个字符串,其中包含所有特殊字符的转义。因此,您可以在要从字面上匹配的任何字符串上使用它(或确定特定字符在正则表达式中是否具有或可以具有特殊含义)。