Share via


Windows PowerShell

O caso das expressões regulares

Don Jones

No passado, escrevi sobre expressões regulares no Windows PowerShell, principalmente da perspectiva de como eles funcionam e como usá-los. Este mês, eu estou concentrado em um aplicativo do mundo real, prático de expressões regulares no shell. Com base em uma solução de cliente criado, isso é um ótimo exemplo de energia ’ expressões regulares.

Um problema de regular

O problema ficou algo assim: Precisava usar o Windows PowerShell para recuperar o texto de uma página da Web. Tenha em mente que transfere a página da Web como um documento de texto simples com instruções HTML em como a página deve ser processada em um navegador. De texto, precisava extrair todos os hiperlinks, exibir como uma lista e uma saída-los para um arquivo de texto local ou salvá-los de alguma forma. Em HTML, um hiperlink é indicado pela marca < a > e poderia ter esta aparência: Click http://concentratedtech.com aqui Para visitar

Uma dificuldade surge em que a marca < a > dá suporte a um número de parâmetros opcionais, como de destino, que força o link para abrir uma nova página. Às vezes, a marca < a > pode existir sem o parâmetro href , em vez disso, incluindo um parâmetro de de nome estabelece uma âncora na página. Eu não especificamente queria capturar aqueles; só queria autêntica links saídas para uma página diferente.

Enquanto eu vai continuar abordam recursos e técnicas disponíveis PowerShell v1 na minha coluna, mais falarei sobre recursos exclusivos v2. V2 PowerShell acompanha e pré-instalado no Windows 7 e Windows Server 2008 R2. Pelo tempo ler este ou logo após, v2 PowerShell deve estar disponível para Windows Vista, Windows Server 2008, Windows XP e Windows Server 2003. Visite Microsoft.com/PowerShell para verificar a disponibilidade e links de download.

Um quebra-cabeças regular

Trabalhando com expressões regulares pode ser muito como resolver um quebra-cabeça. Como se foram deparou em um desses cartazes tridimensionais, squinting Ajuda. Você tem que exibir as informações no formulário de um padrão, em vez de caracteres individuais. Squinting pode ajudar blur os caracteres para que você possa se concentrar no padrão de maior. Considere esses quatro hiperlinks: http://concentratedtech.com. Clique em aqui Para visitar.

< a name = "dados" > Folha de dados < /a >

< a target = "_blank" href="https://microsoft.com" > Microsoft < /a >

< a href="search.aspx" target = "_top" > Pesquisar < /a >

Desejo capturar links que possuem esses elementos comuns:

  • Todos eles começam com < a
  • Todos eles terminam com < /a >
  • Todos eles contêm href = "em algum lugar após o < a e antes do >

Não quero capturar um link que não contêm todos os desses elementos. Ignorando os bits que não se preocupa e squinting, os links terá esta aparência:

< a_href = ” xxxxxxxxx"> xxxxxxx< /a >

< a_xxxxxxxx >xxxxxxx < /a >

< a_xxxxxxxxxx_href = "xxxxxxxxx" > xxxxxxxx < /a >

< a_href = "xxxxxxxxx" _xxxxxxxxxx > xxxxxxxx < /a >

Observe que eu tenha substituído o caractere de espaço com um sublinhado apenas para torná-lo destaquem um pouco mais e substituído coisas que eu não se preocupa com “ x ”. Repentinamente, surge esses início aparência muito mais semelhante e um padrão.

Um padrão normal

padrões são ponto inteiro de expressões regulares. Usando a linguagem de expressão regular, descreva o padrão de texto que você está procurando. Você pode obter uma descrição desse idioma bastante abrangente executando ajuda about_regular_expressions no Windows PowerShell.

No meu caso, minha expressão regular pode parecer algo assim:

(< a\s.{0,}?href=".+?".{0,}? >. +? < /a >)

Sei — está louco. Obter direita demorei sobre uma hora, com uma quantidade enorme de Ajuda de RegExTester.com site do. Deixe-me dividi-lo:

  • (Parênteses) definem um padrão de um único hiperlink e informam o shell para capturar correspondências (mais adiante).
  • O < uma é uma correspondência literal; o shell irá procurar esses dois caracteres.
  • \s significa corresponder um caractere único espaço em branco, como um espaço, sempre deverá seguir < uma em HTML.
  • .{0,}? significa que desejo ver zero ou mais caracteres de qualquer tipo. O período significa “ qualquer caractere ” e {0}, significa zero ou mais. O ponto de interrogação à direita é especial. Faz a correspondência -greedy (mais que em um segundo).
  • Em seguida, desejo ver o literal caracteres href = "
  • Em seguida, desejo consulte um ou mais qualquer caractere. O sinal de mais significa “ um ou mais ” e, novamente, um ponto de interrogação à direita torna greedy.
  • Quero ver uma aspa de fechamento.
  • Em seguida, desejo ver o fechamento e zero ou mais caracteres >.
  • Finalmente, quero ver uma ou mais caracteres antes < /a >. Aqui, também, o ponto de interrogação após o sinal de mais torna isso uma correspondência não greedy.

Este negócios greedy é complicado. Let’s digamos que há a seguinte seqüência de texto em minha página HTML:

Este é um < a href = "teste" > link < /a > e isso é um < a href = "teste" > link < /a >, mas isso não é.

E dizer let’s que estou usando essa expressão regular, não usa os pontos de interrogação para criar correspondências greedy:

(< a\s.{0,}href=".+".{0,} >. < /a > +)

O shell corresponderá a primeira < um espaço e procure de zero ou mais caracteres — terminando somente quando localiza a última < /a >. Usarei negrito para mostrar o que corresponde ao:

Este é um < a href = "teste" > link < /a > e isso é um < a href = "teste" > link < /a > mas isso não é.

É porque o primeiro. {0} correspondente é greedy : O shell consome quantos caracteres possível ao fazer o trabalho de expressão regular. Tornando -greedy , informá-lo consumir como alguns caracteres possível ao fazer o trabalho de expressão regular:

Este é um < a href = "teste" > link < /a > e isso é um < a href = "teste" > link < /a > mas isso não é.

Uma solução regular

Para colocar este trabalho no shell, comecei definindo uma variável de teste e preenchendo com HTML. Em seguida, usado-operador correspondência para corresponder ao teste HTML contra minha expressão regular.

PS C:\ > $ html = ' é um < a href = "teste" > < /a > teste mas < a name = "anchor" > Este < /a > não está e < um destino = "_top" href = "algo" > é < /a > definitivamente um link. '

PS C:\ > $ html - correspondência '(<a\s.{0,}?href=".+?".{0,}?>.+?</a>) '

True

O resultado “ True ” simplesmente informa que o shell encontrou um ou mais correspondências; ele não me dizer o que corresponde. No entanto, após usar o - operador correspondência, o shell automaticamente cria uma matriz, chamada $ correspondências. Essa matriz contém todas as correspondências capturadas:

PS C:\ > $ correspondências

Name valor
1 < a href = "teste" > testar < /a >
0 < a href = "teste" > testar < /a >

Posso acessar correspondências individuais usando sintaxe normal matriz:

PS C:\ > $ corresponde ao [0]

< a href = "teste" > testar < /a >

É possível facilmente enviar aquelas para um arquivo muito:

PS C:\ > $ correspondências | out-file c:\matches.txt

 

Depois que você dominou a sintaxe, como bizarre como está, expressões regulares fornecem uma maneira poderosa e valiosa de correspondência de padrões complexos até mesmo, variáveis em um grande corpo de texto. Você pode extrair o texto que corresponda ao seu padrão e trabalhar com ele independentemente do corpo do texto principal. Isso é especialmente útil para analisar arquivos de log, arquivos HTML ou qualquer outro tipo de texto semi-estruturado.

 

Don Jonesé editor colaborador para TechNet Magazine e publica dicas do Windows PowerShell e notícias em www.ConcentratedTech.com. Ele é co-autor de “ Windows PowerShell: TFM ” (SAPIEN Press, 2009), agora na sua terceira edição e abrangendo versão 2 do Windows PowerShell.

 

Conteúdo relacionado