下面的文件名
$inpFiledev = "abc_XYZ.bak"
我只需要在XYZ一个变量做其它文件名的比较。下面我尝试:
[String]$findev = [regex]::match($inpFiledev ,'_*.').Value
Write-Host $findev
正则表达式中的星号不会以同样的方式表现,因为他们在文件系统挂牌的命令去做。因为它代表你的regex需要下划线,重复零次或多次,跟任何字符(由一个周期的正则表达式来表示)。所以,正则表达式查找零点就在字符串的开始凸显,然后找到“A”,这就是它返回的比赛。
首先,纠正一点:
'_*.'
变为“下划线,随后任何数目的字符,然后是文字期间”。在“文字句”意味着我们需要逃避的正则表达式期间,通过使用\.
,记住那段指任何字符:
'_.*\.'
_
下划线.*
任何数目的字符\.
文字句点返回:
_xyz。
所以,为期不远。
如果你正在寻找返回从字符之间的事情,你需要使用捕获组。把括号围绕要保留位:
'_(.*)\.'
然后,你需要使用PowerShell正则表达式组获得的价值:
[regex]::match($inpFiledev ,'_(.*)\.').Groups[1].Value
返回:XYZ
在组中的数字1 [1]只是意味着第一捕获组,可以通过使用更多的括号你喜欢尽可能多的增加的表达,但只需要一个在这种情况下。
为了有两个PowerShell的习惯替代补充mjsqu's helpful answer:
有关如何正则表达式(正则表达式)在PowerShell中使用的概述,请参阅Get-Help about_regular_expressions
。
使用-split
通过_
和.
分裂,萃取所得到的3元素数组的中间元素:
PS> ("abc_XYZ.bak" -split '[_.]')[1]
XYZ
-split
的(第一)RHS操作数是一个正则表达式;正则表达式[_.]
是一个字符集([...]
)相匹配的单个字符。要么是一个文字_
或文字.
因此,输入abc_XYZ.bak
被分成含有琴弦abc
,XYZ
和bak
阵列。因此,应用指数[1]
提取中间的道理,XYZ
。使用-replace
通过捕获组来提取感兴趣的令牌((...)
,在更换操作数作为$1
简称):
PS> "abc_XYZ.bak" -replace '^.+_([^.]+).+$', '$1'
XYZ
-replace
也运行在一个正则表达式作为第一个RHS操作数 - 什么来代替 - 而第二个操作数规定了什么要更换匹配的(分)字符串。^.+_([^.]+).+$
:
^.+_
匹配在输入(+
)的开始的一个或多个(.
)字符(^
) - 注意.
如何 - 所使用的字符集([...]
)之外 - 是一个正则表达式元字符表示任何字符(在单线输入字符串)。
([^.]+)
是匹配一个否定的字符集((...)
)捕获基团([^...]
):[^.]
任何文字字符相匹配。这不是一个字面.
,一次或多次(+
)。
无论匹配子表达式内(...)
可以在更换操作数作为$<n>
,其中<n>
表示该正则表达式的捕获组的基于1的索引引用;在这种情况下,$1
可以用来指代该第一(只)捕获基团。
.+$
匹配一个或多个(+
)剩余字符(.
),直到达到输入的结尾($
)。$1
仅仅指的是第一个捕获组匹配的是什么;在这种情况下:XYZ
。
对于-replace
更换操作数的语法的综合概述,请参阅this answer。由于您使用的[regex]
加速器,你需要的反斜杠逃脱你的最终.
(如果你想匹配的话),你需要一个点之前,你的星号到您的下划线之后的任何字符匹配。如果之间的字符都是字母,然后用\w+
$findev = [regex]::match($inpFiledev ,'_.*\.')
$findev
_XYZ.
这个演示等两种方式来获得从样品字符串所需的信息。第一次使用的原始字符串的基本.Split()
字符串的方法。第二个假设你正在处理的文件对象,并通过获取.BaseName
的文件开始了。已删除的扩展,所以不用您费心做自己。
如果你正在处理大量的字符串,而不是文件对象,那么前面的正则表达式的答案很可能会更快。 [笑容]
$inpFiledev = 'abc_XYZ.bak'
$findev = $inpFiledev.Split('.')[0].Split('_')[-1]
# fake reading in a file with Get-Item or Get-ChildItem
$File = [System.IO.FileInfo]'c:\temp\testing\abc_XYZ.bak'
$WantedPart = $File.BaseName.Split('_')[-1]
'split on a string = {0}' -f $findev
'split on BaseName of file = {0}' -f $WantedPart
输出...
split on a string = XYZ
split on BaseName of file = XYZ