PowerShell regex - Einführung und Beispiele
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.
{{percentage}} % positiv