PowerShell中的正则表达式了两个特殊字符之间的字符串

问题描述 投票:1回答:4

下面的文件名

$inpFiledev = "abc_XYZ.bak"

我只需要在XYZ一个变量做其它文件名的比较。下面我尝试:

[String]$findev = [regex]::match($inpFiledev ,'_*.').Value
Write-Host $findev
regex powershell
4个回答
5
投票

正则表达式中的星号不会以同样的方式表现,因为他们在文件系统挂牌的命令去做。因为它代表你的regex需要下划线,重复零次或多次,跟任何字符(由一个周期的正则表达式来表示)。所以,正则表达式查找零点就在字符串的开始凸显,然后找到“A”,这就是它返回的比赛。

首先,纠正一点:

'_*.'

变为“下划线,随后任何数目的字符,然后是文字期间”。在“文字句”意味着我们需要逃避的正则表达式期间,通过使用\.,记住那段指任何字符:

'_.*\.'
  • _下划线
  • .*任何数目的字符
  • \.文字句点

返回:

_xyz。

所以,为期不远。

如果你正在寻找返回从字符之间的事情,你需要使用捕获组。把括号围绕要保留位:

'_(.*)\.'

然后,你需要使用PowerShell正则表达式组获得的价值:

[regex]::match($inpFiledev ,'_(.*)\.').Groups[1].Value

返回:XYZ

在组中的数字1 [1]只是意味着第一捕获组,可以通过使用更多的括号你喜欢尽可能多的增加的表达,但只需要一个在这种情况下。


4
投票

为了有两个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被分成含有琴弦abcXYZbak阵列。因此,应用指数[1]提取中间的道理,XYZ

使用-replace通过捕获组来提取感兴趣的令牌((...),在更换操作数作为$1简称):

PS> "abc_XYZ.bak" -replace '^.+_([^.]+).+$', '$1'
XYZ
  • -replace也运行在一个正则表达式作为第一个RHS操作数 - 什么来代替 - 而第二个操作数规定了什么要更换匹配的(分)字符串。
  • 正则表达式^.+_([^.]+).+$^.+_匹配在输入(+)的开始的一个或多个(.)字符(^) - 注意.如何 - 所使用的字符集([...])之外 - 是一个正则表达式元字符表示任何字符(在单线输入字符串)。 ([^.]+)是匹配一个否定的字符集((...))捕获基团([^...]):[^.]任何文字字符相匹配。这不是一个字面.,一次或多次(+)。 无论匹配子表达式内(...)可以在更换操作数作为$<n>,其中<n>表示该正则表达式的捕获组的基于1的索引引用;在这种情况下,$1可以用来指代该第一(只)捕获基团。 .+$匹配一个或多个(+)剩余字符(.),直到达到输入的结尾($)。
  • 更换操作$1仅仅指的是第一个捕获组匹配的是什么;在这种情况下:XYZ。 对于-replace更换操作数的语法的综合概述,请参阅this answer

1
投票

由于您使用的[regex]加速器,你需要的反斜杠逃脱你的最终.(如果你想匹配的话),你需要一个点之前,你的星号到您的下划线之后的任何字符匹配。如果之间的字符都是字母,然后用\w+

$findev = [regex]::match($inpFiledev ,'_.*\.')
$findev
_XYZ.

1
投票

这个演示等两种方式来获得从样品字符串所需的信息。第一次使用的原始字符串的基本.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
© www.soinside.com 2019 - 2024. All rights reserved.