PowerShell - 选择(或正则表达式)以 .story 结尾的单词

PowerShell - 选择(或正则表达式)以 .story 结尾的单词

我试图从一些笔记中提取以 .story 结尾的单词。这些单词总是被放在一些链接中,例如bla:///bla/bla/bla/.../word.story。笔记可能包含多个链接,这些笔记的格式可能有所不同,但我总会以 的形式输入条目bla///../..../bla.story

到目前为止,我使用了以下表达式:[string]$story_name = Select-String \w+..story -input $notes -AllMatches | Foreach {$_.matches -replace ('\.story','')}但现在我遇到了一些问题,因为似乎如果链接包含条目,那么bla:///bla/blablaistory/bla/bla/word.story这个表达式也会选择包含的单词‘历史’我不想发生这种情况。我应该怎么做才能避免这种情况?

答案1

$notes = @"
alalala/bla//blablahistory/somethingnice.istory
alalala/bla//blablahistory/somethingnice.story
alalala/bla//blablahistory/somethingverynice.story
"@

$RE = [RegEx]'/([^/]+)\.story'

$storyName = $notes -split "`n" |
  Select-String $RE -AllMatches | 
    Foreach {$_.Matches.Groups[1]}

$storyName -split "`n" 

示例输出:

> .\SF_852359.ps1
somethingnice
somethingverynice

问题中更复杂的 RegEx 执行以下操作:

  • [^/]是匹配除斜杠之外的所有内容的否定类
  • [^/]+尾随的加号表示至少有一个前一个。
  • ([^/]+)括号标记第一个(这里也是唯一一个)捕获组
  • /([^/]+)\.story前导斜杠和尾随文字.story构成了我们所追求的单词。
  • 正则表达式的结果服務至少一个管道级别,可通过 $_.Matches 对象访问,捕获组从 1 开始编号

相关内容