使用正则表达式在PowerShell中提取字符串的一部分

时间:2016-10-27 19:03:06

标签: regex powershell

我有以下字符串:“D:\ TNTAL_05.05.1080_Local \ Phase_0010”。我需要从这个字符串中提取'Phase_0010'部分。

我正在使用Select-String cmdlt,但我不是很熟悉或非常擅长制作正则表达式以获得我想要的结果。经过许多谷歌搜索后,我仍然无法围绕这个概念。

2 个答案:

答案 0 :(得分:2)

有几种简单的方法可以实现这一目标:

PS > "D:\TNTAL_05.05.1080_Local\Phase_0010".Split("\") | Select-Object -Last 1

或者,如果您实际上更喜欢将路径作为文件使用,则可以使用此选项:

# Path exists
PS > Get-Item "D:\TNTAL_05.05.1080_Local\Phase_0010".Basename

# Path doesn't exist in filesystem
PS > Split-Path "D:\TNTAL_05.05.1080_Local\Phase_0010" -leaf

在这种情况下,-leaf表示Split-Path cmdlet应该只返回文件路径中提供的最后一个元素。

答案 1 :(得分:0)

但为什么要使用正则表达式?

PS C:\> Split-Path "D:\TNTAL_05.05.1080_Local\Phase_0010" -Leaf
Phase_0010

PS C:\> ([System.IO.DirectoryInfo]"D:\TNTAL_05.05.1080_Local\Phase_0010").Name

PS C:\> "D:\TNTAL_05.05.1080_Local\Phase_0010".Split('\')[-1]

这些都更好。但如果你坚持使用正则表达式:

PS C:\> "D:\TNTAL_05.05.1080_Local\Phase_0010" -match '\\([^\\]+)$'
True
PS C:\> $Matches[1]
Phase_0010

因为你想从最后一个反斜杠到结尾匹配。需要转义反斜杠,因为它是正则表达式转义字符。并且解释它是 last 反斜杠的方法是说匹配必须没有反斜杠,并且它必须运行直到行的结尾(因此在其后没有空间用于其他反斜杠)比赛)。所以它匹配“反斜杠后的一个或多个非反斜杠字符,连续到行尾”。

它会与"D:/TNTAL_05.05.1080_Local/Phase_0010"分开,这是一个有效的Windows路径,Split-Path处理得很好。

自我生成的PS帮助链接来自我的代码块(如果有):

  • Split-Path(在模块Microsoft.PowerShell.Management中)