PowerShell regex - Einführung und Beispiele

 
Regex kann in den meisten Skriptsprachen nahezu gleich verwendet werden, daher habe ich die Grundbegriffe und Funktionsweise in einem gesonderten Beitrag zusammengefasst, siehe Regex - Überblick. Dieser Beitrag beinhaltet Spezialiäten bei der Verwendung von Regex in PowerShell, sowie die Beispiele des Regex - Grundlagen Artikels.
 

Powershell: verschiedene Regex-Varianten

PowerShell verfügt über eigene Regex-Operatoren, als Beispiel: -match oder -replace. Nachdem PowerShell zudem einen Zugriff auf das .Net-Regex-Objekt hat, kann auch die .Net-Variante von Regex in PowerShell verwendet werden, wodurch fortgeschrittenere Regex und benutzerdefinierte Optionen zur Verfügung stehen. Auch wenn im Internet die Regex-Beispiele für PowerShell meist den Regex-Operator verwenden, konzentriere ich mich in diesem Artikel auf PowerShell-Beispiele für das .Net-Regex-Objekt. 

Der Vollständigkeit halber zuerst aber ein paar Beispiele zu PowerShell und dessen Regex-Operatoren:

Regex-Operator -match

Prüfen ob ein String einem Suchmuster entspricht

PS C:\> "123" -match "[0-9]{3}"
Result:
True

Alternativ: Anstelle der Zeichengruppe kann auch die Zeichenklasse \d für Dezimalziffern (0-9) verwendet werden:

PS C:\> "123" -match "\d\d\d"
Result:
True

Varianten:

  •  -imatch: ignoriert, genau wie -match die Groß- und Kleinschreibung
  • -cmatch: berücksichtigt: Groß- und Kleinschreibung
  • -notmatch: liefert "true" wenn kein Treffer gefunden wurde

Replace-Operator -replace

PS C:\> "123" -replace "\d\d\d", "456"
Result:
456

.Net Regex [Regex]

Ein Blick auf die Members zeigt uns die möglichen Optionen:

PS C:\> [regex]::new($pattern) | Get-Member
Result:

   TypeName: System.Text.RegularExpressions.Regex

Name                MemberType Definition
----                ---------- ----------
Count               Method     int Count(string input), int Count(System.ReadO…
EnumerateMatches    Method     System.Text.RegularExpressions.Regex+ValueMatch…
Equals              Method     bool Equals(System.Object obj)
GetGroupNames       Method     string[] GetGroupNames()
GetGroupNumbers     Method     int[] GetGroupNumbers()
GetHashCode         Method     int GetHashCode()
GetObjectData       Method     void ISerializable.GetObjectData(System.Runtime…
GetType             Method     type GetType()
GroupNameFromNumber Method     string GroupNameFromNumber(int i)
GroupNumberFromName Method     int GroupNumberFromName(string name)
IsMatch             Method     bool IsMatch(string input), bool IsMatch(string…
Match               Method     System.Text.RegularExpressions.Match Match(stri…
Matches             Method     System.Text.RegularExpressions.MatchCollection …
Replace             Method     string Replace(string input, string replacement…
Split               Method     string[] Split(string input), string[] Split(st…
ToString            Method     string ToString()
MatchTimeout        Property   timespan MatchTimeout {get;}
Options             Property   System.Text.RegularExpressions.RegexOptions Opt…
RightToLeft         Property   bool RightToLeft {get;}

Suche nach einem Treffer

.Net Match

$string="123456"
$regex = [regex] "\d\d\d"
$regex.Match($string).value
Result:
123

Suche nach mehreren Treffern: .Net Matches

$string = "123456"
$regex = [regex] "\d\d\d"
$regex.Matches($string)
Result:

Groups    : {0}
Success   : True
Name      : 0
Captures  : {0}
Index     : 0
Length    : 3
Value     : 123
ValueSpan : 

Groups    : {0}
Success   : True
Name      : 0
Captures  : {0}
Index     : 3
Length    : 3
Value     : 456
ValueSpan : 

Groups

$string="123456"
$match="\d\d\d"
[Regex]::Matches($string, $match)
Result:

Groups    : {0}
Success   : True
Name      : 0
Captures  : {0}
Index     : 0
Length    : 3
Value     : 123
ValueSpan : 

Groups    : {0}
Success   : True
Name      : 0
Captures  : {0}
Index     : 3
Length    : 3
Value     : 456
ValueSpan : 

Das PowerShell MatchCollection-Objekt teilt die Ausgabe in Gruppen:

Als Beispiel kann die Ausgabe bei nur einer Gruppe wie folgt ausgegeben werden:

$string="123456"
$match="\d\d\d"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where-Object -property Name -eq 0).value
$result.options
Result:
123
456

Beispiele:

$string="<html><head></head><body><h1>Headline</h1></body></html>"
$match="<h1>(.*)</h1>"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 1).value
Result:
Headline

group 0: Treffer, inkl. MatchString: in dem Beispiel inkl. <h1> und </h1>

group 1: Treffer ohne MatchString

Sollten sich im String mehrere Headlines <h1></h1> befinden, würde Matches den Inhalt zwischen dem Ersten <h1> und dem Letzten </h1> als Ergebnis ausgeben:

$string="<html><head></head><body><h1>First Headline</h1><h1>Second Headline</h1></body></html>"
$match="<h1>(.*)</h1>"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 1).value
Result:
First Headline</h1><h1>Second Headline

Text zwischen "[" und "]"

$string="Text [innerhalb der eckigen Klammern]"
$match="[[](.*)[]]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 1).value
Result:
innerhalb der eckigen Klammern

Beispiel "[A-Z]{3,5}"

$string="Bitte nur 3, 4 oder 5 GROSSbuchstaben in Folge"
$match="[A-Z]{3,5}"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
GROSS

Optionen

In PowerShell können die bekannten Regex-Optionen wie folgt verwendet werden:

Option Zahl Regex-Option Beschreibung
IgnoreCase 1 i Groß- und Kleinschreibung ignorieren
Multiline 2 m  
ExplicitCapture  4 n  
Compiled 8 nicht vorhanden  
Singleline 16 s  
IgnorePatternWhitespace 32 x  
RightToLeft 64 nicht vorhanden  

Optionen in PowerShell können durch Angabe der angeführten Keywords verwendet werden:

$regex = [regex]::new($pattern,"IgnoreCase,Multiline")
$regex.Options
Result:
IgnoreCase, Multiline

Alternativ kann auch ein Zahl verwendet werden, welche sich aus den Binärwerten der oben angeführten Zahlen zusammensetzt, als Beispiel:

1 (IgnoreCase) + 2 (MultiLine) + 32 (IgnorePatternWhitespace) = 35

$regex = [regex]::new($pattern,35)
$regex.Options
Result:
IgnoreCase, Multiline, IgnorePatternWhitespace

Beispiele vom Regex-Grundlagen-Artikel

Die folgenden Beispiele stammen von unserem Artikel zu den Regex-Grundlagen und werden dort beschrieben und erklärt.

Zeichengruppen

siehe: Regex: Zeichengruppen - Zeichenauswahl.

text 

$string="ich lerne Regex"
$match="lerne"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
lerne

[abc]

$string="abcdefghijk..."
$match="[abc]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
a
b
c

[a-z]

$string="abcdefghijklmnopqrstuvwxyz..."
$match="[a-e]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
a
b
c
d
e

Alle Zeichen außer den angeführten 

$string="abcde"
$match="[^abc]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
d
e

Zahl, Punkt oder Minus

$string="Text mit 1-3.123"
$match="[0-9\.\-]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
1
-
3
.
1
2
3

([ab])([cd])

$string="abcdefgh"
$match="([ab])([cd])"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
bc

a|b

$string="abcdefgh"
$match="a|b"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
a
b

Symbole die kein Buchstabe oder keine Zahl sind 

$string="ab!cdefg?h"
$match="[^A-Za-z0-9]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
!
?

Zeichenklassen

Auch die Beispiele zu den Zeichenklassen stammen von unserem Artikel zu den Regex-Grundlagen und werden dort beschrieben und erklärt, siehe Regex: Zeichenklassen

alphanumerische Zeichen 

$string="String"
$match="."
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
S
t
r
i
n
g

Dezimalziffer 

$string="A847"
$match="\d"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
8
4
7

keine Dezimalziffer

$string="A847"
$match="\D"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
A

ein Buchstabe, Zahl oder Unterstrich

$string="B??spiel"
$match="\w"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
B
s
p
i
e
l

kein Buchstabe, Zahl oder Unterstrich

$string="B%?spiel"
$match="\W"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
%
?

Leerzeichen

$string="Beispiel String"
$match="\s"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
 

kein Leerzeichen

$string="Beispiel String"
$match="\S"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
B
e
i
s
p
i
e
l
S
t
r
i
n
g

Quantifizierer

Auch hier, siehe Regex-Grundlagen, bzw. Regex: Quantifizierer

+

$string="String"
$match="[A-Z]+"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
S

*

$string="String"
$match=".*"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
String

?

$string="String"
$match="[A-Z]?"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
S






{} 

$string="String"
$match=".{3}"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
Str
ing

Greedy vs Non-Greedy oder Lazy Matching

siehe Regex-Grundlagen, bzw. Regex: Greedy vs Non-Greedy oder Lazy Matching

Standard: Greedy

$string="<html><head></head><body><h1>First Headline</h1><p>Text</p><h1>Second Headline</h1></body></html>"
$match="<h1>(.*)</h1>"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
<h1>First Headline</h1>Text<h1>Second Headline</h1>

Non-Greedy oder Lazy Matching:

$string="<html><head></head><body><h1>First Headline</h1><p>Text</p><h1>Second Headline</h1></body></html>"
$match="<h1>(.*?)</h1>"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
<h1>First Headline</h1>
<h1>Second Headline</h1>

Ergebnis-Gruppe 1:

$string="<html><head></head><body><h1>First Headline</h1><p>Text</p><h1>Second Headline</h1></body></html>"
$match="<h1>(.*?)</h1>"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 1).value
Result:
First Headline
Second Headline

letzter Treffer

$string="
<h1>First Headline</h1>
<h1>Second Headline</h1>
<h1>Third Headline</h1>"
$match=".*<h1>(.*?)</h1>(?!(\s|.)*<)"
$([Regex]::Match($string, $match).groups | Where Name -eq 1 ).value
Result:
Third Headline

Anker - Anchors

Erklärungen und Details, siehe Regex-Grundlagen und Regex: Anker

^ - zu Beginn eines Strings suchen

$string="Beispiel-String"
$match="^[A-Za-z]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
B

$ - am Ende eines Strings suchen

$string="Beispiel-String"
$match="[A-Za-z]$"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
g

Der Treffer muss an einer Wortgrenze auftreten

$string="Beispiel String"
$match="[A-Za-z]\B"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
B
e
i
s
p
i
e
S
t
r
i
n

Gruppieren

Erklärungen und Details, siehe: Regex-Grundlagen und Regex: Quantifizierer

( Subausdruck )

$string="Teesst"
$match="(\w)\1"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
ee
ss

<name>Subausdruck

$string="Teesst"
$match="(?<doppelt>\w)\k<doppelt>"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
ee
ss

positiv Lookahead

$string="33 und 44X."
$match="[0-9]{1,}(?=X)"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
44

positiv Lookbehind

$string="X33 und 44X"
$match="(?<=X)[0-9]{1,}"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
33

negativ Lookahead

$string="Nummer9 hat kein a vor der Nummer a8 schon"
$match="(?<!a)[0-9]"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
9

if-then-else 

$string="X10 B90 Y524 123"
$match="(?<BWert>B)?(?(BWert)[0-9]{2}\b|\b[0-9]{3}\b)"
$result=[Regex]::Matches($string, $match)
$($result.groups | Where Name -eq 0).value
Result:
B90
123

Ersetzen

Erklärungen und Details, siehe: Regex-Grundlagen und Regex: Ersetzungen.

$string="eins zwei"
$match="(\w+)\s(\w+)"
$replace="`$2 `$1"
[Regex]::Replace($string, $match,$replace)
Result:
zwei eins

Details und Beschreibungen zu den hier angeführten Beispielen,
siehe: Regex - Überblick - Begriffe - Parameter - Theorie - Grundlagen.

 

 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Veröffentlichung: 28.11.2021 von Bernhard |🔔 | Kommentare:0

Regex, Überblick, Begriffe, Parameter, Grundlagen und Beispiele | Windows PowerShell | MD5-Hash eines Strings erzeugen

Top-Artikel in diesem Bereich


Windows PowerShell Skript erstellen und ausführen - erlauben

Im einfachsten Fall ist ein PowerShell-Skript eine Textdatei mit einer Reihe von PowerShell-Befehlen. Als PowerShell Skript versteht man eine Datei mit der Endung .ps1. Die Skriptdatei kann eine Sammlung von Befehlen, Funktionen oder Cmdlets enthalten.


PowerShell Log-Files: Logging in eine Textdatei - write to file

Logfiles in PowerShell können über den Befehl Out-File, über eine eigene Funktion oder über das in PowerShell integrierte Transcript erstellt werden.


Regex, Überblick, Begriffe, Parameter, Grundlagen und Beispiele

Regex ist eine universelle Beschreibungssyntax um bestimmte Teile aus Zeichenketten zu prüfen oder zu filtern. Als Beispiel könnten mit Regex sehr einfach alle <h1>-Überschriften aus einem HTML-Quellcode herausgefiltert werden. Angefangen mit PHP, habe ich Regex später auch in PowerShell und JavaScript eingesetzt. Zugegeben, anfangs habe ich Beispiele aus dem Internet für meine Einsatzzwecke angepasst und diese nur teilweise verstanden, zumal die Regex-Syntax doch...

Fragen / Kommentare