PowerShell中的正则表达式匹配

24

有没有一个简洁的一行代码来实现以下操作?

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

我对$myVar变量感兴趣...


抱歉,您能澄清一下 $foo 中包含的内容吗?它是一个数组吗?$matches 应该代表什么? - Emiliano Poggi
抱歉,$foo是一个普通的字符串,例如$foo="abcDEF" .. $myVar应该包含"DEF"。 - ted
我现在明白了,看看我的答案是否合适。 - Emiliano Poggi
我的回答不符合您的需求吗? - Emiliano Poggi
5个回答

24

只需使用-replace

$foo = 'abcDEF'
$myMatch = "^abc(.*)"
$myVar = $foo -replace $myMatch,'$1'
#$myVar contains DEF

19

我经常使用以下类似的代码:

([regex]"^abc(.*)").match($foo).groups[1].value

它并不是很符合PowerShell的规范,至少不太适用于PowerShell V2(我们正在退回到.NET类)...但它非常紧凑。


4

在澄清后改变答案:

真正的一行代码:

$myvar = ($foo | ? {$_ -match $myMatch} | select @{L="Matches";E={$matches[1]}}).matches

假的一行代码:

$foo | ? {$_ -match $myMatch} ; $myvar = $matches[1]

注:以上内容涉及it技术。

4

我不确定这个方案是否优雅,但以下是一些有用的信息:

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

0

将其封装成一个函数。

如果您已经对现有的解决方案感到满意并理解它,但需要缩短代码长度,那么这几乎总是正确的答案。如果函数的命名恰当,它还可以开始生成自我文档化和可重复使用的代码。还有什么比这更好的呢?

即使您确定有更优雅或更有效的解决方案需要找到,您仍然可以首先将其作为函数调用,然后如果其他解决方案出现,您只需在一个位置 - 也就是函数定义本身进行更改。您甚至可以插入和拔出不同的选项来测试所有用例的可靠性。还有什么比这更好的呢?

其他人可能会抱怨函数调用的开销,但这既不是开发的正确阶段,也不是担心的正确类型或编程语言。在以后的调试过程中,“聪明”的一行代码失败的尝试总是超过了良好而干净的函数调用的成本。现在就做出关于清洁函数调用API的明智决策,以后可以将函数转换为类方法,并且类本身可以无缝地包装高级缓存和优化技术。函数调用的低级优化应留给低级语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接