PowerShell中的正则表达式匹配

时间:2011-05-04 09:52:47

标签: regex powershell

是否有优雅的单行代码来执行以下操作?

$myMatch = "^abc(.*)"
$foo -match $myMatch
$myVar = $matches[1]

我对$myVar变量......

感兴趣

5 个答案:

答案 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的良好决策可以稍后将函数转换为类方法,并且类本身可以无缝包装高级缓存和优化技术。函数调用的下层优化应该留给下层语言。