PowerShell - Selecione (ou regex para) palavras que terminem em .story

2

Estou tentando extrair algumas notas, palavras que terminam em .story. Essas palavras são sempre colocadas em alguns links, como bla:///bla/bla/bla/.../word.story . As notas podem conter vários links e o formato dessas notas pode variar, mas sempre terei entradas na forma de bla///../..../bla.story .

Até agora, usei a seguinte expressão: [string]$story_name = Select-String \w+..story -input $notes -AllMatches | Foreach {$_.matches -replace ('\.story','')} , mas agora estou enfrentando alguns problemas com isso, porque parece que, se o link contiver entradas como bla:///bla/blablaistory/bla/bla/word.story , essa expressão também selecionará a palavra que contém < strong> 'istory' e eu não quero que isso aconteça. O que devo usar para evitar isso?

    
por pandoJohn 26.05.2017 / 10:18

1 resposta

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" 

Exemplo de saída:

> .\SF_852359.ps1
somethingnice
somethingverynice

O RegEx mais complexo como na pergunta faz o seguinte:

  • [^/] é uma classe negada que combina tudo menos uma barra
  • [^/]+ o trailing plus significa pelo menos um dos anteriores.
  • ([^/]+) os parênteses delimitadores marcam o primeiro (e aqui apenas) grupo de captura
  • /([^/]+)\.story a barra inicial e o literal à direita .story enquadram a palavra que procuramos.
  • Resultados de uma expressão regular survice pelo menos um nível de canal e são acessíveis através do objeto $ _. Matches, sendo os grupos de captura numerados de 1
por 26.05.2017 / 14:23