Назад | Перейти на главную страницу

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

$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 создайте слово, которое нам нужно.
  • Результаты регулярного выражения служба по крайней мере один уровень канала и доступен через объект $ _. Соответствует, группы захвата нумеруются от 1