用法 |在 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 一个所有特殊字符都已转义的字符串。因此,您可以在任何您想要按字面匹配的字符串上使用它(或确定特定字符在正则表达式中是否具有或可以具有特殊含义)。
答案已经解释了 |
的用途,但我想解释一下上面每个示例的情况。
-split '\[|\]'
:您正在尝试匹配 [
或 ]
,这就是您得到 3 结果的原因.第一个是空行,它是由第一个 [
之前的行开头表示的空白
-split '\[\]'
:由于您在此示例中省略了 |
符号,因此您请求拆分字符 sequence []
它没有出现在你的字符串中。这与代码 $_.split('\[\]')
形成对比,它会在每个字符上拆分。这是设计使然。
-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。这种行为也应该在其他引擎上看到。
我正在尝试使用 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 一个所有特殊字符都已转义的字符串。因此,您可以在任何您想要按字面匹配的字符串上使用它(或确定特定字符在正则表达式中是否具有或可以具有特殊含义)。
答案已经解释了 |
的用途,但我想解释一下上面每个示例的情况。
-split '\[|\]'
:您正在尝试匹配[
或]
,这就是您得到 3 结果的原因.第一个是空行,它是由第一个[
之前的行开头表示的空白
-split '\[\]'
:由于您在此示例中省略了|
符号,因此您请求拆分字符 sequence[]
它没有出现在你的字符串中。这与代码$_.split('\[\]')
形成对比,它会在每个字符上拆分。这是设计使然。-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。这种行为也应该在其他引擎上看到。