regex - 是否可以使用`switch -regex`获得匹配位置
问题描述
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
whereIndex
并Length
指定每个匹配的位置。
但是,我在使用switch -regex
. 例如:
switch -regex ('abcxyzabc') {
'abc(?<x>.*)abc' {
$matches
}
}
给出:
Name Value
---- -----
x xyz
0 abcxyzabc
我找不到任何类似的东西Index
并Length
在$matches
.
我还检查了Matches
返回的类型Select-String -Pattern
是System.Text.RegularExpressions.Match[]
,而$matches
in的类型switch -regex
是System.Collections.Hashtable
。
我错过了什么或者switch -regex
不应该提供每场比赛的位置吗?
解决方案
我错过了什么或者
switch -regex
不应该提供每场比赛的位置吗?
实际上,语句的switch 和(有效的)底层运算符都不switch
-Regex
-match
是为了通过自动$Matches
变量提供捕获的文本以外的信息- 请参阅此答案以获取更多信息。
获取匹配位置信息(开始索引、长度)需要以下条件之一:
Select-String
cmdlet,如您的问题所示。直接使用底层
[regex]
类 (System.Text.RegularExpressions.Regex
)。
将后者应用于您的示例:
PS> [regex]::Match('abcxyzabc', 'abc(?<x>.*)abc')
Groups : {0, x}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 9
Value : abcxyzabc
Daniel 的有用答案向您展示了一种通过switch
.
更有效的方法是将foreach
语句与if
语句结合起来:
foreach ($str in 'abcxyzabc', '...') {
if (($match = [regex]::Match($str, 'abc(?<x>.*)abc')).Success) { <# ... #> }
elseif (($match = [regex]::Match($str, 'cde(?<x>.*)cde')).Success) { <# ... #> }
# ...
}
推荐阅读
- python - Tkinter 组合框在条目中输出数据
- android - 后台执行不允许接收意图 BOOT_COMPLETED
- c# - Selenium - 通过谷歌帐户登录(空白,白色窗口)
- php - Microsoft 图表 - 无法向我的消息添加附件
- c# - 有人可以使用 C# 统一代码在我的测验游戏中帮助我吗
- javascript - Vue关于Reactivity in Depth,为什么Vue可以这样检测属性添加?
- python - 正则表达式匹配问题与 \d* 和 |
- angularjs - 将日期与最小值和最大值进行比较不起作用
- c# - XAML - PostAsync 将空数据发送到数据库
- prestashop - 在移动设备中查看 prestashop 页面时,如何用 html 数据填充 _mobile_* div