【发布时间】:2021-09-26 04:07:41
【问题描述】:
Select-String -Pattern 返回每个匹配的位置。例如:
$s = 'abcxyzabc' | Select-String -Pattern 'abc(?<x>.*)abc'
$s.Matches[0].Groups | Select-Object Name, Value, Index, Length
给予:
Name Value Index Length
---- ----- ----- ------
0 abcxyzabc 0 9
x xyz 3 3
其中Index 和Length 指定每个匹配的位置。
但是,在使用switch -regex 时,我找不到如何获取每个匹配项的位置。例如:
switch -regex ('abcxyzabc') {
'abc(?<x>.*)abc' {
$matches
}
}
给予:
Name Value
---- -----
x xyz
0 abcxyzabc
我找不到像 Index 和 Length 这样的东西来获取 $matches 中的匹配位置。
我还检查了Select-String -Pattern返回的Matches的类型是System.Text.RegularExpressions.Match[],而switch -regex中$matches的类型是System.Collections.Hashtable。
我错过了什么还是switch -regex 不应该提供每场比赛的位置?
【问题讨论】:
-
尽管有 Powershell。在计算机编程语言中,switch 语句是一种选择控制机制,用于允许变量或表达式的值通过搜索和映射来改变程序执行的控制流。因此,布尔值,而不是字符串。就像一个简单的 if/then。 Switch 语句有两种主要变体:结构化和非结构化 switch。
-
正如
mklement0所指出的,完全跳过switch 语句。([regex]::Match('abcxyzabc', 'abc(?<x>.*)abc')).Groups | Select-Object Name, Value, Index, Length,好吧,除非你只是渴望使用它,否则这些都是一样的。switch -regex (([regex]::Match('abcxyzabc', 'abc(?<x>.*)abc')).Groups) { $PSItem {$PSItem | Select-Object Name, Value, Index, Length}}和switch (([regex]::Match('abcxyzabc', 'abc(?<x>.*)abc')).Groups) {$PSItem {$PSItem | Select-Object Name, Value, Index, Length}}.
标签: regex powershell switch-statement