Windows PowerShell

Perché espressioni regolari

Don Jones

I n passato, ho scritto sulle espressioni regolari in Windows PowerShell, principalmente dal punto di vista del loro funzionamento e come utilizzarli. Questo mese, sto concentrandosi su un'applicazione reale, pratica delle espressioni regolari nella shell. In base a una soluzione di clienti che è stata creata, questo è un ottimo esempio di alimentazione ’ espressioni regolari.

Un problema ordinario

Il problema è andato qualcosa di simile: È stato necessario utilizzare Windows PowerShell per recuperare il testo di una pagina Web. Tenere presente che la pagina Web viene trasferita come documento di testo semplice con istruzioni HTML nella modalità di rendering della pagina in un browser. Da tale testo è stato necessario estrarre tutti i collegamenti ipertestuali, visualizzarli come un elenco e uno output li in un file di testo locale o salvarle in alcuni altri utile. In HTML, un collegamento ipertestuale indicato dal tag < a > e dovrebbe risultare simile al seguente: Click http://concentratedtech.com here Per visitare

Una difficoltà si verifica in quanto il tag < a > supporta un numero di parametri facoltativi, ad esempio di destinazione, che impone il collegamento per aprire in una nuova pagina. In alcuni casi, il tag < a > può esistere senza il parametro di href , tra cui invece di un parametro name , che stabilisce un ancoraggio nella pagina. In particolare non desidero acquisire quelli; volevo solo validi creatori collegamenti in uscita a una pagina diversa.

Mentre potrà continuare a coprire le funzionalità e tecniche disponibili in v1 PowerShell nel mio articolo, più mi concentrerò sulle funzionalità univoche v2. PowerShell v2 viene fornito con ed è preinstallato in Windows 7 e Windows Server 2008 R2. Nel momento in cui si legge o subito dopo, PowerShell v2 dovrebbe essere disponibile per Windows Vista, Windows Server 2008, Windows XP e Windows Server 2003. Visitare Microsoft.com/PowerShell per verificare la disponibilità e scaricare i collegamenti.

Un puzzle regolari

Utilizzo di espressioni regolari può essere molto simile a risoluzione di un puzzle. Come se sono stati staring a uno di tali poster tridimensionale, squinting aiuta. È necessario visualizzare le informazioni nel modulo di un criterio di ricerca, anziché come caratteri singoli. Squinting può aiutare blur i caratteri è possibile concentrarsi sul modello di dimensioni maggiore. Prendere in considerazione questi quattro collegamenti ipertestuali: http://concentratedtech.com. Fare clic su here Per visitare.

< a name = "dati" >foglio di dati < /a >

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

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

Desidera acquisire i collegamenti che dispongono di tali elementi comuni:

  • Tutti i iniziano con < un
  • Tutti i terminare con < /a >
  • Contengano href = "in un punto dopo il < un e prima del >

Non si desidera acquisire un collegamento che non contiene tutti i di questi elementi. Ignorando i bit che non interessano e squinting, i collegamenti simile al seguente:

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

< a_xxxxxxxx > xxxxxxx< /a >

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

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

Si noti che ho sostituito il carattere spazio con un carattere di sottolineatura per renderlo risalto un po' più e sostituito stuff che non interessano con “ x. ” Improvvisamente, questi inizio alla aspetto molto più simile e un motivo multiple.

Un criterio di ricerca regolare

motivi sono il punto di intero di espressioni regolari. Utilizzando il linguaggio delle espressioni regolari, è possibile descrivere lo schema del testo per il quale si esegue la ricerca. È possibile ottenere una descrizione piuttosto dettagliata di tale lingua eseguendo Guida about_regular_expressions in Windows PowerShell.

Nel mio caso, l'espressione regolare è possibile che un aspetto simile al seguente:

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

È possibile sapere, ovvero è pazzesco. Recupero di destra, mi richiedeva circa un'ora, con una quantità enorme di informazioni della Guida da RegExTester.com sito Web. Consenti interruzione verso il basso:

  • (Parentesi) definiscono un modello per un singolo collegamento ipertestuale e indicano alla shell di acquisire corrispondenze (ulteriori informazioni su questo più avanti).
  • Il < un viene trovata una corrispondenza letterale; la shell eseguirà la ricerca di questi due caratteri.
  • \s significa confrontare un carattere singolo gli spazi vuoti, come uno spazio, deve sempre seguire < un in HTML.
  • .{0,}? significa che si desidera visualizzare zero o più caratteri di qualunque tipo. Il periodo significa “ qualsiasi carattere ” e {0}, significa che zero o più caratteri. Il punto interrogativo finale è speciale. Rende la corrispondenza non generici (ulteriori informazioni su che in un secondo).
  • Successivamente, si desidera visualizzare il valore letterale di caratteri href = "
  • Successivamente, si desidera visualizzare uno o più di qualsiasi carattere. Il segno più (+) significa “ uno o più ” e, ancora una volta, un punto interrogativo finale rende non generici.
  • In seguito, che si desidera visualizzare un segno di apostrofo finale.
  • Quindi si desidera visualizzare zero o più caratteri e la chiusura >.
  • Infine, si desidera visualizzare uno o più caratteri prima < /a >. In questo caso, troppo, il punto interrogativo dopo il segno più (+) rende questo una corrispondenza non generici.

Questa business non generici è complessa. Pronunciare Let’s che dispone della seguente stringa di testo in una pagina HTML:

Si tratta di un < a href = "test" > collegamento < /a > e questo è un < a href = "test" > collegamento < /a >, ma ciò non è.

E let’s pronunciare che sto utilizzando questa espressione regolare, non utilizza i punti interrogativi per creare corrispondenze non generici:

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

La shell corrisponderà al primo < un spazio e quindi cercare zero o più caratteri — termina solo quando viene rilevato l'ultima < /a >. Utilizzerò grassetto per mostrare cosa corrisponde:

Si tratta di un < a href = "test" > collegamento < /a > e questo è un < a href = "test" > collegamento < /a > ma ciò non è.

La ragione è che il primo. {0}, corrispondenza è generici : La shell utilizza come numero di caratteri possibili mentre si effettua il lavoro di espressione regolare. Rendendo non generici , che è possibile stabilire consumano meno caratteri possibili mentre si effettua il lavoro di espressione regolare:

Si tratta di un < a href = "test" > collegamento < /a > e questo è un < a href = "test" > collegamento < /a > ma ciò non è.

Una soluzione regolare

Per mettere a questo scopo nella shell, ho iniziato definendo una variabile di test e compilarlo con HTML. Quindi utilizzata l'opzione-operatore di corrispondenza in modo che corrisponda il test HTML contro mio espressione regolare.

PS C:\ > $ html = ' si tratta di un < a href = "test" > test < /a > ma < a name = "ancoraggio" > this < /a > non è e < una destinazione = "_top" href = "qualcosa" > in modo definito è un collegamento < /a >. '

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

True

Il risultato “ True ” semplicemente avverte che la shell di trova una o più corrispondenze, non avvisare di corrispondenza. Tuttavia, dopo aver utilizzato il - operatore di corrispondenza, la shell crea automaticamente una matrice denominata $ corrispondenze. Questa matrice contiene tutte le corrispondenze acquisite:

PS C:\ > $ corrispondenze

Nome Value
1 < a href = "test" > test < /a >
0 < a href = "test" > test < /a >

È possibile accedere a singole corrispondenze utilizzando la sintassi di matrice normale:

PS C:\ > $ corrisponde a [0]

< a href = "test" > test < /a >

Posso facilmente inviare quelli in un file troppo:

PS C:\ > $ corrispondenze | out-file c:\matches.txt

 

Una volta è stato masterizzato la sintassi, come bizarre come nel caso, le espressioni regolari forniscono un modo utile e potente di rilevamento di sequenze anche complessi, variabile in un grande corpo del testo. È possibile estrarre il testo che corrisponde al criterio e utilizzarlo indipendentemente il corpo principale del testo. Ciò risulta particolarmente utile per l'analisi dei file di registro, file HTML o qualsiasi altro tipo di testo semistrutturato.

 

Don Jonesè un redattore per TechNet Magazine e pubblica di Windows PowerShell suggerimenti e delle news in www.ConcentratedTech.com. È coautore di “ Windows PowerShell: TFM ” (Sapien Press, 2009), ora nella relativa edizione terza e coprire Windows PowerShell versione 2.

 

Contenuto correlato