Я пытаюсь извлечь из некоторых заметок слова, оканчивающиеся на .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
чем это выражение также выберет то слово, которое содержит "история" и я не хочу, чтобы это произошло. Что мне следует использовать, чтобы этого избежать?
$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
создайте слово, которое нам нужно.