Windows PowerShell

Argumentos a favor de las expresiones regulares

Don Jones

E n el pasado, he escrito sobre las expresiones regulares en Windows PowerShell, principalmente desde la perspectiva de cómo funcionan y cómo utilizarlos. Este mes, estoy centrándose en una aplicación práctica reales de expresiones regulares en el shell. Según se ha creado una solución de cliente, éste es un buen ejemplo de energía de ’ expresiones regulares.

Un problema regular

El problema fue algo así: Necesitaba usar Windows PowerShell para recuperar el texto de una página Web. Tenga en cuenta que la página Web se transfiere como un documento de texto simple con instrucciones HTML en cómo se debe representar la página en un explorador Web. Desde ese texto, que necesitaba extraer todos los hipervínculos, mostrarlos como una lista y alguna salida ellos a un archivo de texto local o guardarlos de alguna otra forma. En HTML, un hipervínculo se indica mediante la etiqueta < a > y podría tener este aspecto: http://concentratedtech.com Click here para visitar

Una dificultad consiste en que la etiqueta < a > admite un número de parámetros opcionales, como los de destino, que fuerza el vínculo para abrir una nueva página. A veces, puede existir la etiqueta <a> sin el parámetro de href, incluidos en su lugar name un parámetro que establece un delimitador en la página. Específicamente no deseo capturar aquellas; sólo quería auténtico vínculos salientes a una página diferente.

Mientras continuaré cubrir las características y técnicas disponibles en v1 de PowerShell en mi columna, más me centraré en las características exclusivos de v2. PowerShell v2 se incluye con y está preinstalado en Windows 7 y Windows Server 2008 R2. En el momento en leer esto o poco después, PowerShell v2 debe estar disponible para Windows Vista, Windows Server 2008, Windows XP y Windows Server 2003. Visite Microsoft.com/PowerShell para comprobar la disponibilidad de y vínculos de descarga.

Un puzzle regular

Trabajar con expresiones regulares puede ser mucho como resolver un rompecabezas. Como si estaban fijamente en uno de estos pósteres tridimensionales, squinting ayuda a. Tiene que ver la información en el formulario de un patrón, en lugar de como caracteres individuales. Squinting puede ayudar a difuminar los caracteres para poder centrarse en el modelo mayor. Considere estos cuatro hipervínculos: http://concentratedtech.com. Haga clic en here para visitar.

< a name = "datos" > de hoja de datos < /a >

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

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

Deseo capturar vínculos que tengan estos elementos comunes:

  • Todas se inician con < a
  • Todos ellos finalizan con < /a >
  • Contienen href = "en algún lugar después de la < a y antes de la >

No es necesario capturar un vínculo que no contenga todos los de estos elementos. Omitiendo los bits que no me interesa y squinting, los vínculos tendría este aspecto:

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

< a_xxxxxxxx > xxxxxxx< /a >

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

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

Observe que he reemplazado el carácter de espacio con un carácter de subrayado simplemente para que sea Destaque un poco más y reemplaza las cosas que no me interesa con “ x. ” De repente, emerge estos inicio a un modelo y de aspecto mucho más similar.

Un modelo regular

patrones son el objetivo de expresiones regulares. Mediante el lenguaje de expresión regular, describa el modelo de texto que se busca. Puede obtener una descripción bastante completa de ese idioma ejecutando de Ayuda about_regular_expressions en Windows PowerShell.

En mi caso, mi expresión regular podría ser algo como esto:

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

Sé — es loco. Obteniendo derecho me tardó aproximadamente una hora, con una cantidad enorme de Ayuda desde el sitio Web RegExTester.com. Permitirme dividirla:

  • Definen una trama para un único hipervínculo (paréntesis) y saber el shell a capturar las coincidencias (más adelante).
  • El < un es una coincidencia literal; el shell buscará esos dos caracteres.
  • \s significa para hacer coincidir un carácter de espacio en blanco único, como un espacio, que debe seguir siempre < una en HTML.
  • .{0,}? Deseo ver cero o más caracteres de cualquier tipo de medio. El período significa “ cualquier carácter ” y el {0}, significa cero o más. El signo de interrogación final es especial. Hace que la coincidencia no expansivo (más que en un segundo).
  • A continuación, desea ver el literal de caracteres href = "
  • A continuación, desea ver uno o más de cualquier carácter. Significa el signo más “ uno o más ” y, una vez más, un signo de interrogación final hace no expansivo.
  • A continuación, desea ver una comilla de cierre.
  • A continuación, desea ver cero o más caracteres y el cierre >.
  • Por último, desea ver uno o más caracteres antes < /a >. Aquí, demasiado, el signo de interrogación tras el signo más facilita esta una coincidencia no expansiva.

Esta empresa no expansiva es complicada. Diga Let’s que tengo la cadena de texto siguiente en mi página HTML:

Se trata de una < a href = "prueba" > vínculo < /a > y esto es una < a href = "prueba" > vínculo < /a >, pero esto no es.

Y diga let’s que estoy utilizando esta expresión regular, que no utiliza los signos de interrogación para crear a no expansivos coincidencias:

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

El shell coincidirá con la primera < un espacio y, a continuación, busque cero o más caracteres de — final sólo cuando encuentra la última < /a >. Usaré negrita para mostrar que coincida con:

Esto es un < a href = "prueba" > vínculo < /a > y esto es una < a href = "prueba" > vínculo < /a > , pero esto no es.

Eso es porque la primera. {0}, coincidencia es ávido : El shell consume tantos caracteres como sea posible mientras realiza el trabajo de expresión regular. Por lo que no expansivo , puede saber para consumir tan pocos caracteres como sea posible mientras realiza el trabajo de expresión regular:

Esto es un < a href = "prueba" > vínculo < /a > y esto es un < a href = "prueba" > vínculo < /a > , pero esto no es.

Una solución regular

Para poner esto funcione en el shell, iniciado mediante la definición de una variable de prueba y rellenarlo con HTML. A continuación, utiliza el - operador de coincidencia para que coincida con la prueba HTML con mi expresión regular.

P.D. C:\ > $ html = ' es una < a href = "prueba" > < /a > prueba pero < a name = "anchor" > no es esta < /a > y < un destino = "_top" href = "algo" > definitivamente es un vínculo de < /a >. '

P.D. C:\ > $ html - coincidencia '(<a\s.{0,}?href=".+?".{0,}?>.+?</a>) '

True

El resultado “ True ” simplemente me dice que el shell encontró uno o más coincidencias; no Informarme a lo que coincide. Sin embargo, después de utilizar el coincidencia operador-, el shell crea automáticamente una matriz, denominada $ coincide con. Esta matriz contiene todas las coincidencias capturadas:

P.D. C:\ > $ coincide con

Nombre Valor
1 < a href = "prueba" > Probar < /a >
0 < a href = "prueba" > Probar < /a >

Puedo obtener acceso a coincidencias individuales utilizando la sintaxis normal de la matriz:

P.D. C:\ > $ coincide con [0]

< a href = "prueba" > Probar < /a >

Puedo fácilmente enviar aquellos a un archivo, demasiado:

P.D. C:\ > $ coincide con | out-file c:\matches.txt

 

Una vez haya asimilado la sintaxis, como bizarre como es, expresiones regulares proporcionan una forma eficaz y valiosa de coincidencia de patrones complejos incluso, variables en un gran cuerpo de texto. Puede extraer el texto que coincida con su modelo y trabajar con él independientemente del cuerpo principal del texto. Esto resulta especialmente útil para analizar archivos de registro, archivos HTML o cualquier otro tipo de texto semiestructurado.

 

Don Joneses redactor de TechNet Magazine y publica sugerencias de Windows PowerShell y noticias en www.ConcentratedTech.com. Es el coautor del “Windows PowerShell: TFM ” (SAPIEN Press, 2009), ahora en su tercera edición y que cubre la versión 2 de Windows PowerShell.

 

Contenido relacionado