PowerShell正则表达式捕获差异

时间:2018-11-01 14:53:43

标签: regex powershell

目标是从字符串中仅获取SPACE字符之前的前导数字。当我在PowerShell中使用-replace时,会包含前导字母字符。为什么有什么不同?

PS C:\src\t> 'aasdf123 456' -replace '([\d]+) .*', '$1'
aasdf123

在产生的regex101.com上不会发生这种情况。

123

非重复

问题不在于如何获取号码。问题是为什么'aasdf'\d相匹配。捕获组仅指定\d

1 个答案:

答案 0 :(得分:0)

该行为是预期的。

-replace运算符从输入字符串保持中删除所有不重叠的匹配项。 >

'aasdf123 456' -replace '([\d]+) .*', '$1'将返回assdf123,因为([\d]+) .*(等于(\d+) .*)匹配并捕获到组1中一个或多个数字,然后匹配一个空格,然后该行的其余部分,然后将整个匹配项(此处为123 456替换为第1组的内容123,因此,将assdf123保留为{{1 }}操作。

您关于regex101产生另一个结果的声明是错误的:it produces the same result

enter image description here

即使您查看 -replace 窗格,也有两个值:整体匹配MATCH INFORMATION和第1组值123 456。因此,完全没有差异。

要只得到123,您可以使用How to get the captured groups from Select-String?

中描述的解决方案