有没有一个简洁的一行代码来实现以下操作?
$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]
我对$myVar
变量感兴趣...
有没有一个简洁的一行代码来实现以下操作?
$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]
我对$myVar
变量感兴趣...
只需使用-replace
:
$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF
我经常使用以下类似的代码:
([regex]"^abc(.*)").match($foo).groups[1].value
它并不是很符合PowerShell的规范,至少不太适用于PowerShell V2(我们正在退回到.NET类)...但它非常紧凑。
在澄清后改变答案:
真正的一行代码:
$myvar = ($foo | ? {$_ -match $myMatch} | select @{L="Matches";E={$matches[1]}}).matches
假的一行代码:
$foo | ? {$_ -match $myMatch} ; $myvar = $matches[1]
我不确定这个方案是否优雅,但以下是一些有用的信息:
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
将其封装成一个函数。
如果您已经对现有的解决方案感到满意并理解它,但需要缩短代码长度,那么这几乎总是正确的答案。如果函数的命名恰当,它还可以开始生成自我文档化和可重复使用的代码。还有什么比这更好的呢?
即使您确定有更优雅或更有效的解决方案需要找到,您仍然可以首先将其作为函数调用,然后如果其他解决方案出现,您只需在一个位置 - 也就是函数定义本身进行更改。您甚至可以插入和拔出不同的选项来测试所有用例的可靠性。还有什么比这更好的呢?
其他人可能会抱怨函数调用的开销,但这既不是开发的正确阶段,也不是担心的正确类型或编程语言。在以后的调试过程中,“聪明”的一行代码失败的尝试总是超过了良好而干净的函数调用的成本。现在就做出关于清洁函数调用API的明智决策,以后可以将函数转换为类方法,并且类本身可以无缝地包装高级缓存和优化技术。函数调用的低级优化应留给低级语言。
$foo
中包含的内容吗?它是一个数组吗?$matches
应该代表什么? - Emiliano Poggi