Use -match , -notmatch or -replace to identify string patterns. More complex patterns can be matched by adding a regular expression.

RegEx characters: ^ . [ ] - g G ? + * p P w W s S d D $

Match exact characters anywhere in the original string:

PS C:> 'Ziggy stardust' -match 'iggy'

True

A period . will match a single character:

PS C:> 'cat' -match 'c.t'

True

PS C:> 'Ziggy stardust' -match 's..rdust'

True

Match any (at least one) of the characters - place the options in square brackets [ ]

PS C:> 'Ziggy stardust' -match 'Z[xyi]ggy'

True

Match a range (at least one) of characters in a contiguous range [*n*-*m*]

PS C:> 'Ziggy stardust' -match 'Zigg[x-z] Star'

True

Match anything but these, a caret (^) will match any character except those in brackets

PS C:> 'Ziggy stardust' -match 'Zigg[^abc] Star'

True

Match anything but these characters, specify in one or more contiguous ranges [^*n*-*m*]

PS C:> 'abc' -match '[^abc-ijk-xyz]'

False

PS C:> 'abc' -match '[^ijk-xyz]'

True

Match only if at the beginning of the line: ^

PS C:> 'no alarms and no surprises' -replace '**^**no',''

alarms and no surprises

Match only if at the end of the line: $

PS C:> 'There must be some way out of here said the joker to the joker' -replace 'joker**$**','thief'

There must be some way out of here said the joker to the thief

Match zero or more instances of the preceding character: *

PS C:> 'Z' -match 'g*'

True

PS C:> 'ZZZZZ' -match '^Z*$'

True

One or more matches, matching as much as possible: +

PS C:> 'A' -match 'S+'

False

PS C:> 'AaaAAA' -match '^A*$'

True

Zero or one matches, matching as much as possible: ?

PS C:> 'Ziggy stardust' -match 'g?'

Match the character that follows as an escaped character

PS C:> 'Ziggy$' -match 'Ziggy\$'

Match any character in a character class: \p{*name*}

Supported names are Unicode groups and block ranges for example, Ll (Letter, Uppercase), Nd (Number, Decimal Digit), Z (All separators), IsGreek, IsBoxDrawing.

PS C:> 'ZiGGY Stardust' -match '\p{Ll}+'

Match text **not** included in groups and block ranges: \P{*name*} .

PS C:> 1234 -match '\P{Ll}+'

Match any word character: \w This is equivalent to [a-zA-Z_0-9]

PS C:> 'Ziggy_stardust' -match '\w+'

Match any **non-**word character \W This is equivalent to [^a-zA-Z_0-9]

PS C:> 'Ziggy~stardust' -match '\W+'

True

Match any white-space: \s This is equivalent to [ \f\n\r\t\v]

PS C:> 'Ziggy stardust' -match '\s+'

True

Match any **non**-white-space: \S This is equivalent to [^ \f\n\r\t\v]

PS C:> 'Ziggy' -match '\S+'

True

Match any decimal digit: \d This is equivalent to \p{Nd} for Unicode and [0-9] for non-Unicode

PS C:> 'klmn0pq' -match '\d+'

Match any **non**-digit: \D This is equivalent to \P{Nd} for Unicode and [^0-9] for non-Unicode

PS C:> '789o123' -match '\D+'

Exactly *n* matches: {*n*}

PS C:> 'sssss' -match '^s{5}$'

True

PS C:> 'sssss' -match '^s{4}$'

False

Match *n* or more matches, matching as much as possible: {*n,*}

PS C:> 'sssss' -match '^s{3,}$'

True

Match between *n* and *m *matches, matching as much as possible: {*n,m*}

PS C:> 'sssss' -match '^s{6,9}$'

False

Matching as *little* as possible can be done by appending a ?

*? Zero or more matches

+? One or more matches

?? Zero or one matches

{*n*}? Exactly *n* matches

{n,}? N or more matches

{n,m}? Between n and m matches

In addition to the above PowerShell also supports the quantifiers available in .NET regular expressions, these allow even more specific criteria such as: the string must match at least 5, but no more than 10 items.

The .Net framework uses a traditional NFA regex engine, to learn more about regular expressions look for the book *Mastering Regular Expressions by Jeffrey Friedl*

*“Mere enthusiasm is the all in all. . . .Passion and expression are beauty itself” ~ William Blake*

**Related:**

Comparison -like, -lt, -gt, -eq, -ne, -match

Wildcards - Match multiple items

Escape characters - double \\ to escape them