在powershell中获取文件名中正则表达式的索引
Posted
技术标签:
【中文标题】在powershell中获取文件名中正则表达式的索引【英文标题】:Get index of regex in filename in powershell 【发布时间】:2016-05-14 18:50:25 【问题描述】:我正在尝试获取文件夹名称中正则表达式匹配的起始位置;
dir c:\test | where $_.fullname.psiscontainer | foreach
$indexx = $_.fullname.Indexofany("[Ss]+[0-9]+[0-9]+[Ee]+[0-9]+[0-9]")
$thingsbeforeregexmatch.substring(0,$indexx)
理想情况下这应该可以工作,但由于 indexofany 不能像我卡住那样处理正则表达式。
【问题讨论】:
奖励:您可以将该正则表达式简化为[Ss]+\d2,[Ee]+\d2,
,或者使用不区分大小写的修饰符(i
)更好:s+\d2,e+\d2,
。它匹配一个或多个s
,然后是两个或多个数字,然后是一个或多个e
,然后是两个或多个数字。
【参考方案1】:
您可以使用 Match 对象的 Index 属性。示例:
# Used regEx fom @RedLaser's comment
$regEx = [regex]'(?i)[s]+\d2[e]+\d2'
$testString = 'abcS00E00b'
$match = $regEx.Match($testString)
if ($match.Success)
$startingIndex = $match.Index
Write-Host "Match. Start index = $startingIndex"
else
Write-Host 'No match found'
【讨论】:
【参考方案2】:您可以使用Regex.Match()
method 执行正则表达式匹配。它将返回一个 MatchInfo
对象,该对象具有您可以使用的 Index
属性:
Get-ChildItem c:\test | Where-Object $_.PSIsContainer | ForEach-Object
# Test if folder's Name matches pattern
$match = [regex]::Match($_.Name, '[Ss]+[0-9]+[0-9]+[Ee]+[0-9]+[0-9]')
if($match.Success)
# Grab Index from the [regex]::Match() result
$Index = $Match.Index
# Substring using the index we obtained above
$ThingsBeforeMatch = $_.Name.Substring(0, $Index)
Write-Host $ThingsBeforeMatch
或者,使用-match
运算符和$Matches
变量来获取匹配的字符串并将其用作IndexOf()
的参数(使用RedLaser's sweet regex optimization):
if($_.Name -match 's+\d2,e+\d2,')
$Index = $_.Name.IndexOf($Matches[0])
$ThingsBeforeMatch = $_.Name.Substring(0,$Index)
【讨论】:
以上是关于在powershell中获取文件名中正则表达式的索引的主要内容,如果未能解决你的问题,请参考以下文章