是否有优雅的单行代码来执行以下操作?
$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]
我对$myVar
变量......
答案 0 :(得分:22)
只需使用-replace
:
$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
答案 1 :(得分:17)
我经常使用以下内容:
([regex]"^abc(.*)").match($foo).groups[1].value
它不是PowerShell-y,或者至少不是PowerShell V2-y(我们重新回到.NET类)......但它非常紧凑。
答案 2 :(得分:3)
澄清后更改了答案:
真单行:
$myvar = ($foo | ? {$_ -match $myMatch} | select @{L="Matches";E={$matches[1]}}).matches
假单行:
$foo | ? {$_ -match $myMatch} ; $myvar = $matches[1]
答案 3 :(得分:2)
我不确定优雅,但这里有用的东西:
PS > "123.134" -match "(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})"
True
PS > $Matches
Name Value
---- -----
P2 134
P1 123
0 123.134
PS > $Matches["P1"]
123
?<P1>
为第一次捕获提供了标签P1
。这有助于理解。
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches("123.123")[0].groups["P1"].value
123
在你的情况下:
PS > $foo = "123.143"
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches($foo)[0].groups["P1"].value
123
PS > ([regex]("(?<P1>[0-9]{3})\.(?<P2>[0-9]{3})")).matches($foo)[0].groups["P2"].value
143
答案 4 :(得分:0)
将其包装在函数中。
如果您已经满意并了解有效的解决方案,但需要使其更短,那么这几乎总是正确的答案。如果函数的名称正确,它也将开始生成可自我记录和可重复使用的代码。有什么可能会更好?
即使您确定可以找到更优雅或更有效的解决方案-您仍然可以先将其设为函数调用,然后再使用其他解决方案,则只需在一个位置进行更改-函数定义本身。您甚至还可以插入和拔出不同的选项,以针对所有用例进行可靠性测试。有什么可能会更好?
其他人可能会抱怨函数调用开销,但这实际上既不是正确的开发阶段,也不是担心它的正确类型或编程语言。在“可爱的”单层代码上调试失败的尝试总是会超过一个好的,干净的函数调用的代价。现在,有关干净函数调用API的良好决策可以稍后将函数转换为类方法,并且类本身可以无缝包装高级缓存和优化技术。函数调用的下层优化应该留给下层语言。