在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中获取文件名中正则表达式的索引的主要内容,如果未能解决你的问题,请参考以下文章

powershell 阅读INI文件/正则表达式

可以在这个 PowerShell 脚本中使用正则表达式吗?

无法将正则表达式模式表单文件解析为 powershell 中的变量

在PowerShell中组合两个正则表达式

Powershell Get File/Disk Size

在 PowerShell 中的正则表达式匹配的每个实例之后附加字符