
Getty Images/iStockphoto
Wie Sie reguläre Ausdrücke (Regex) in PowerShell verwenden
Ein regulärer Ausdruck (Regex) ist eine Reihe von Zeichen, die ein übereinstimmendes Muster im Text bestimmen, um Eingaben zu validieren und Informationen zu finden.
Das Auffinden bestimmter Informationen in einem Text oder einer Eingabe kann mühsam sein. Glücklicherweise gibt es eine Möglichkeit, diesen Prozess zu vereinfachen.
Reguläre Ausdrücke (Regular Expressions, Regex) bestehen aus einer Folge von Zeichen, die zusammen ein Muster definieren, das abgeglichen werden soll. Reguläre Ausdrücke werden zum Beispiel häufig zur Validierung von Eingaben oder zum Auffinden bestimmter Informationen in einer langen Textkette verwendet. Reguläre Ausdrücke können auch für die Manipulation von Zeichenketten verwendet werden.
Reguläre Ausdrücke sind nicht PowerShell-spezifisch. Die meisten modernen Programmiersprachen unterstützen von Haus aus die Verwendung von regulären Ausdrücken.
Reguläre Ausdrücke können sehr komplex sein. Eine umfassende Diskussion der Syntax regulärer Ausdrücke würde den Rahmen dieses Artikels sprengen, aber einige der am häufigsten verwendeten Elemente sind die folgenden:
- Ein Sternchen * gibt an, dass das vorhergehende Zeichen oder die vorhergehende Gruppe null- oder mehrmals vorkommen kann.
- Klammern [] definieren eine Zeichengruppe, innerhalb derer genau ein Zeichen übereinstimmen muss. Zum Beispiel zeigt [abc] an, dass das Zeichen A, B oder C sein muss.
- Ein Caret-Symbol innerhalb von Klammern [^] bedeutet eine Negation: Anstatt anzugeben, dass ein Zeichen mit den in Klammern stehenden Zeichen übereinstimmen muss, zeigt das Caret an, dass ein Zeichen mit keinem der eingeklammerten Zeichen übereinstimmen kann. Wenn Sie eine Eingabe überprüfen und sicherstellen wollen, dass die Buchstaben A, B oder C nicht eingegeben werden, können Sie [^abc] verwenden.
Die Beispiele für die Verwendung regulärer Ausdrücke sind einfach und ein wenig albern, aber Sie können den Ansatz nach Bedarf anwenden.
Datenextraktion
In einem PowerShell-Skript können Sie mit regulären Ausdrücken Daten suchen und extrahieren. Sie könnten beispielsweise ein Skript erstellen, das bestimmte Daten in einer Protokolldatei sucht, oder eines, das Informationen aus einer Webseite extrahiert.
Um zu zeigen, wie Sie reguläre Ausdrücke für die Datenextraktion verwenden können, habe ich eine Textdatei namens SampleParagraph.txt erstellt. Diese Textdatei enthält meinen Namen und meine Kontaktdaten sowie die ersten Absätze dieses Artikels – so, wie ich sie dem Redakteur liefern würde.
Es ist einfach, ein PowerShell-Skript zu erstellen, das eine Textdatei liest und in dieser Datei nach einer Zeichenfolge sucht – in diesem Fall nach einer E-Mail-Adresse. Sie müssen nicht einmal reguläre Ausdrücke verwenden, um eine solche Aufgabe zu bewältigen. Sie können eine bestimmte E-Mail-Adresse mit diesem Befehl suchen:
Select-String -Path SampleParagraph.txt -Pattern '<email address>'
Wenn Sie sich Abbildung 1 ansehen, können Sie sehen, dass dieser Befehl meine E-Mail-Adresse in der zweiten Zeile der Datei gefunden hat.

Sie benötigen keine regulären Ausdrücke, um Daten in einer Textdatei zu finden. Sie sind in Situationen nützlich, in denen Sie nicht genau wissen, welche Text Sie extrahieren müssen. Man kann reguläre Ausdrücke verwenden, wenn die Beispieldatei eine E-Mail-Adresse enthielte und man sie finden müsste, aber nicht wüsste, wie die E-Mail-Adresse lautet. In dieser Situation funktioniert der vorherige Befehl nicht, da es keinen Literalwert – eine bestimmte E-Mail-Adresse – gibt, nach dem man suchen kann.
E-Mail-Adressen folgen einem bestimmten Format. Sie enthalten ein wenig Text, ein @-Zeichen, ein weiteres Stück Text, einen Punkt und einen Top-Level-Domain-Namen. Diese standardisierte Formatierung ermöglicht es, eine E-Mail-Adresse in einer Datei zu finden, auch wenn wir die Adresse nicht genau kennen. Hier ist ein Befehl, den Sie verwenden können:
Select-String -Path SampleParagraph.txt -Pattern '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b'
Wie Sie sehen können, ist der erste Teil des Befehls identisch mit dem zuvor verwendeten. Der Unterschied besteht darin, dass nicht nach einem Literalwert, sondern nach einem Muster gesucht wurde. Obwohl das Muster kryptisch aussieht, hat es eine Bedeutung.
Das \b am Anfang des Musters teilt PowerShell mit, dass die Übereinstimmung an einer Wortgrenze erfolgen soll, also an einer Stelle, an der ein Buchstabe auf ein Nicht-Buchstaben-Zeichen trifft. Das bedeutet im Wesentlichen, dass alle Übereinstimmungen am Anfang oder Ende eines Wortes erfolgen sollten.
Der nächste Teil des Musters, [A-Za-z0-9._%+-]+, teilt PowerShell mit, dass der erste der E-Mail-Adresse Groß- oder Kleinbuchstaben, Zahlen oder eines von mehreren verschiedenen Symbolen enthalten kann. Wie Sie sich vielleicht erinnern, gilt diese Art von Mustervergleich normalerweise für ein einzelnes Zeichen. Das Zeichen + am Ende dieses Teils des Ausdrucks gibt jedoch an, dass eine Übereinstimmung ein oder mehrere Zeichen enthalten kann.
Danach enthält das Muster ein @-Symbol, das dem @-Zeichen in der E-Mail-Adresse entspricht, und dann ein weiteres Muster, das mit dem für den ersten Teil der Adresse verwendeten identisch ist. Hier wird Benutzername und Domain getrennt.
Der letzte Teil des Musters ist \.[A-Za-z]{2,}\b‘. Dadurch wird PowerShell mitgeteilt, dass die gesuchte Textzeichenfolge – die E-Mail-Adresse – mit einem Punkt, zwei oder mehr Zeichen und einem Wortumbruch enden sollte. Der Grund, warum wir nach zwei oder mehr Zeichen suchen, ist, dass einige E-Mail-Adressen dreistellige Top-Level-Domain-Namen verwenden, wie .com, .gov oder .edu, andere jedoch zweistellige, wie .de. Wenn PowerShell angewiesen wird, nach mindestens zwei Zeichen zu suchen, kann das Suchmuster E-Mail-Adressen mit beiden Arten von Top-Level-Domain-Namen finden.

Eingabevalidierung
Sie können reguläre Ausdrücke auch als Tool zur Validierung von Eingaben verwenden. Angenommen, Sie haben ein PowerShell-Skript erstellt, das den Benutzer auffordert, eine E-Mail-Adresse einzugeben. Sie können den Musterabgleich regulärer Ausdrücke verwenden, um festzustellen, ob die Eingabe des Benutzers dem von E-Mail-Adressen verwendeten Format entspricht. Ein solches Skript könnte folgendermaßen aussehen:
$Email=Read-Host "Please enter an email address"
if ($Email -match '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') {
Write-Host "This looks like an email address"
} else {
Write-Host "Invalid Email Address"
}

String-Manipulation
Genauso wie Sie reguläre Ausdrücke zur Überprüfung von Zeichenketten verwenden können, können Sie sie auch zur Manipulation verwenden. Es gibt unzählige Anwendungsmöglichkeiten für die Manipulation von Zeichenketten. Überlegen Sie, wie Sie die Manipulation von Zeichenketten in Verbindung mit der Validierung von Eingaben verwenden können. Wenn Sie ungültige Eingaben entdecken, können Sie diese in manchen Fällen mit Hilfe der String-Manipulation automatisch korrigieren.
Mein Vorname hat zum Beispiel eine etwas ungewöhnliche Schreibweise: Brien, statt Brian. Wie Sie sich vorstellen können, wird mein Name oft falsch geschrieben. Die beiden häufigsten Fehlschreibungen sind Brian und Brain. Hier ist ein einfaches PowerShell-Skript, das auf diese beiden Schreibfehler prüft und sie korrigiert:
$Name=Read-Host "Please type Posey's first name"
If ($Name -Match "Br[ia][ia]n")
{
$Name='Brien'
Write-Host "The name's spelling has been corrected to " $Name
}
Else
{
Write-Host "The name was spelled correctly"
}

In diesem Skript wird der Benutzer aufgefordert, meinen Vornamen einzugeben, und der eingegebene Text wird in einer Variablen namens $Name gespeichert. Das Skript überprüft die dritte und vierte Position des Namens und ersetzt Brain und Brian durch Brien. Wird eine falsche Schreibweise erkannt, wird sie automatisch korrigiert.
Dieser Ansatz kann in einer Situation nützlich sein, in der ein Benutzer eine Produktnummer in ein PowerShell-Skript eingeben muss. Wenn Sie wissen, dass die Produktnummer immer mit dem Buchstaben P beginnt, können Sie die Eingabe validieren und dann die soeben demonstrierte Technik verwenden, um ein ungültiges Anfangszeichen zu ersetzen, falls erforderlich.