Getty Images
Entdecken Sie erweiterte reguläre Ausdrücke in PowerShell
Lernen Sie, wie Sie anspruchsvollere Techniken für reguläre Ausdrücke entwickeln können, indem Sie verstehen, wie Sie mit Umgehungen mit verschiedenen Operatoren arbeiten können.
Informationen sind Macht und das Wissen, wie man schnell Daten durchforstet, ist eine wichtige IT-Fähigkeit.
Durch die Kombination von PowerShell-Kenntnissen und der Syntax regulärer Ausdrücke (Regex) verbessern Sie Ihre Fähigkeiten und können Protokolle und Konfigurationsdateien geschickt handhaben. So finden Sie schneller, was Sie brauchen. PowerShell bezüglich der Komplexität regulärer Ausdrücke nahezu keine Grenzen, aber für anspruchsvollere Techniken müssen Sie wissen, wie Sie mit der gesamten verfügbaren Syntax arbeiten. Die folgenden Beispiele zeigen Ihnen, wie Sie über die grundlegende Konstruktion regulärer Ausdrücke hinausgehen und komplexere Aufgaben bei der Arbeit mit Text in Ihren Automatisierungsbemühungen durchführen können.
Wie man mit Lookaheads und Lookbehinds arbeitet
In regulären Ausdrücken bestätigen Lookaheads und Lookbehinds – zusammenfassend als Lookarounds bezeichnet – Zeichen vor oder nach einer Übereinstimmung, ohne dass dieser Text Teil der Übereinstimmung ist.
Wenn Sie beispielsweise mit einem regulären Ausdruck ein PowerShell-Skript durchsuchen, um alle Variablennamen zu finden, die nicht mit einem Dollarzeichen beginnen, verwenden Sie einen Lookaround. So teilen Sie dem regulären Ausdruck mit, dass ein Dollarzeichen vor der Zeichenfolge stehen muss, es aber nicht in die Übereinstimmung einbezogen wird.
Die Syntax für den Lookaround ist einfach:
- positive Vorausschau: (?=regex)
- negative Vorausschau: (?!regex)
- positive Nachsuche: (?<=regex)
- negatives Nachschlagen: (?<!regex)
Positive und negative Lookarounds werden verwendet, um ein Muster auf der Grundlage des umgebenden Textes zu finden oder auszuschließen. Ein positiver Lookaround stimmt überein, wenn das Muster von einer bestimmten Zahlenfolge gefolgt wird. Eine negative Umkehr prüft auf ein Muster, auf das keine bestimmte Zeichenfolge folgt.
Der folgende reguläre Ausdruck baut auf dem früheren Beispiel auf, um Variablen in einem PowerShell-Skript abzugleichen:
'(?<=\$)\w+'
In diesem Beispiel wird ein positives Lookbehind verwendet und der reguläre Ausdruck innerhalb des Lookbehinds ist \$. Da das Dollar-Zeichen in regulären Ausdrücken ein Sonderzeichen ist, müssen Sie einen Backslash als Trennzeichen verwenden. Das bedeutet, dass das Zeichen als solches gesucht wird und nicht seine besondere Bedeutung im Kontext regulärer Ausdrücke.
Um das in einem PowerShell-Skript zu verwenden, leiten Sie dessen Inhalt an das cmdlet Select-String weiter:
Get-Content 'Curl2PS.psm1' | Select-String -Pattern '(?<=\$)\w+' -AllMatches
Wie man den -replace-Operator verwendet
Es gibt einen guten Grund, warum man nicht einfach mit dem Dollarzeichen abgleichen und das verwirrende lookbehind überspringen sollte. Eine der wichtigsten Anwendungen für reguläre Ausdrücke ist das Ersetzen von Text. Lookbehinds helfen bei der Kontrolle der Übereinstimmung, wenn Gruppen in einem Regex-Ausdruck zum Ersetzen von Daten verwendet werden.
Wenn Sie zum Beispiel ein Skript geschrieben haben, dann aber feststellen, dass es nicht ideal ist, $null auf der rechten Seite einer bedingten Anweisung zu verwenden, dann müssen Sie $null von der rechten Seite auf die linke Seite der bedingten Anweisungen verschieben. Sie können einen regulären Ausdruck schreiben, der auf Vergleiche passt, die $null auf der rechten Seite des -eq-Operators verwenden:
'(?<=(if|while) ?\()(?<exp>.*) -eq \$null(?=\))'
Hier ist eine Aufschlüsselung des regulären Ausdrucks:
- (?<=(if|while) ?\(): Dieser Ausdruck prüft auf eine if- oder while-Anweisung, gefolgt von einem Leerzeichen oder nicht und einer öffnenden Klammer. Reguläre Ausdrücke unterscheiden zwischen Groß- und Kleinschreibung, so dass dieser Ausdruck nur auf if- und while-Anweisungen mit Kleinbuchstaben passen würde.
- (?<exp>.*) -eq \$null: Das .* stimmt mit einer beliebigen Zeichenfolge überein und ordnet sie der genannten Gruppe zu. Darauf folgt der Operator -eq und dann $null. Es ist kompliziert, einen regulären Ausdruck zu schreiben, um jeden möglichen Ausdruck auf der linken Seite der bedingten Anweisung zu berücksichtigen, aber es wäre über den abstrakten Syntaxbaum von PowerShell anstelle eines regulären Ausdrucks möglich.
- (?=\)): Das ist eine positive Vorausschau, die auf die schließende Klammer prüft.
Um den Grund für Lookarounds in diesem Zusammenhang zu verstehen, muss man lernen, wie man mit dem Operator -replace arbeitet. Sie verwenden -replace in PowerShell, um Text auf der Grundlage eines regulären Ausdrucks auszutauschen. Sie müssen sich nicht darum kümmern, das if, while oder Klammern zu ersetzen, da die Lookarounds diese enthalten. Konzentrieren Sie sich auf die übereinstimmenden bedingten Anweisungen.
Das letzte Teil des Puzzles besteht darin, zu verstehen, wie man Gruppen in -replace verwendet. Sie können jede Gruppe in einem regulären Ausdruck über ihren Namen oder Index referenzieren. Ich empfehle Ihnen, Ihre Gruppen zu benennen, denn alles, was über eine einfache Ersetzung durch einen regulären Ausdruck hinausgeht, macht es verwirrend, sich die Reihenfolge der Übereinstimmungen zu merken. In diesem Fall habe ich eine Gruppe namens exp, die Sie mit ${exp} referenzieren.
Das folgende Beispiel verwendet eine einfache if-else-Anweisung für die Zeichenkette:
$str = @'
if ($RealName -eq $null) {
$FakeName
} elseif ($FakeName -eq $null) {
$RealName
}
'@
Verwenden Sie anschließend -replace, um die bedingten Anweisungen durch ihr Gegenteil zu ersetzen:
$str -replace '(?<=(if|while) ?\()(?<exp>.*) -eq \$null(?=\))','$null -eq ${exp}'
Die Ausgabe zeigt die vertauschten bedingten Anweisungen. Durch die Verwendung von Lookarounds blieben die if-Anweisungen intakt.
Arbeiten mit dem Operator -split
Ein weiterer Anwendungsfall für Lookarounds ist der Operator -split, der eine Zeichenkette auf der Grundlage eines regulären Ausdrucks trennt. Wenn Sie eine Umgehungslösung verwenden, können Sie Ihr Muster abgleichen, ohne zu viele Zeichen aufzuteilen.
Um ein Beispiel für eine Telefonnummer zu verwenden, nehmen wir normalisierte Telefonnummern (USA-Format) und teilen sie in die Vorwahl und die Telefonnummer auf. Das bedeutet, dass sie am Bindestrich aufgeteilt werden, aber nur am ersten Bindestrich, dem eine schließende Klammer vorangestellt ist.
Zur Veranschaulichung hier das Telefonnummernformat:
'(123)-456-7890'
Dieser reguläre Ausdruck passt auf einen Bindestrich, dem eine schließende Klammer vorangestellt ist.
'(?<=\))-'
'(?<=\))-' ist das Lookbehind, um nach einer schließenden Klammer zu suchen, - passt auf den Bindestrich.
Das folgende Beispiel trennt den Bindestrich, ohne auch die schließende Klammer zu trennen:
'(123)-456-7890' -split '(?<=\))-'
Erweiterte reguläre Ausdrücke bieten viele Möglichkeiten, ein Problem zu lösen
Bei Lookarounds gibt es in der Regel eine Alternative, die funktioniert und vielleicht weniger verwirrend ist. Wenn Sie zum Beispiel den Wert einer Zeichenkette zwischen Anführungszeichen abgleichen müssen, gibt es zwei einfache Möglichkeiten. Sie können einen negativen Zeichensatz verwenden oder alles abgleichen, was von einem Anführungszeichen gefolgt wird.
Hier ist unser Beispiel-String:
'Hello, my name is "Anthony" and I am the author.'
Zwei reguläre Ausdrücke würden hier funktionieren:
'"(?<name>[^"]+)"'
'(?<=").+(?=")'
Beide liefern die gewünschten Daten. Für einen besseren regulären Ausdruck könnten Sie eine Kombination verwenden:
'(?<=")(?<name>[^"]+)(?=")'
Das liefert den Namen zwischen den Anführungszeichen, wie im Screenshot gezeigt. Die Erkenntnis ist, dass es nicht nur einen richtigen Weg gibt, einen regulären Ausdruck zu konstruieren.
Es ist hilfreich, sich mit Lookarounds auszukennen
Wenn Sie Ihre Kenntnisse über die Syntax regulärer Ausdrücke erweitern, können Sie bei Ihren täglichen Verwaltungsaufgaben eine Vielzahl von Problemen angehen.
Auch wenn Lookarounds etwas kompliziert anmuten können, so haben sie doch ihren berechtigten Stellenwert bei regulären Ausdrücken, insbesondere wenn es um die Arbeit mit den Operatoren -replace und -split geht. Wenn Sie reguläre Ausdrücke regelmäßig verwenden, kommt der Zeitpunkt, an dem Sie wissen, wie Sie mit Lookarounds arbeiten können.