我试图从一些笔记中提取以 .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 开始编号