用法 |在 PowerShell 正则表达式中

Usage of | in PowerShell regex

我正在尝试使用 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 '\[\]')}

我得到以下输出而没有 [] 被剥离(本质上它只是显示 select-string 输出:

[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 '\[|')}

在输出中,[ 从一开始就被去掉了,但是输出的每个字符后都有一个回车符 return(出于 space 的目的,我没有包含完整的输出) .

0
2
]
:

.
/
m
e

竖线字符“|”分隔正则表达式中的替代项。

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

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

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

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

  1. -split '\[|\]':您正在尝试匹配 [],这就是您得到 3 结果的原因.第一个是空行,它是由第一个 [

  2. 之前的行开头表示的空白
  3. -split '\[\]':由于您在此示例中省略了 | 符号,因此您请求拆分字符 sequence [] 它没有出现在你的字符串中。这与代码 $_.split('\[\]') 形成对比,它会在每个字符上拆分。这是设计使然。

  4. -split '\[|':在这里,您 运行 需要注意不要为 | 运算符指定右手操作数。指定此正则表达式时引用 Regex101 的帮助:

(null, matches any position)

Warning: An empty alternative effectively truncates the regex at this point because it will always find a zero-width match

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