Bird
Raised Fist0
PowerShellscripting~10 mins

Regular expressions with -match in PowerShell - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Regular expressions with -match
Input String
↓
Apply -match with regex
↓
Check if pattern matches?
No→Output: False
Yes↓
Output: True
↓
Store matched substring in $matches
↓
Use $matches for further processing
The flow shows how PowerShell uses -match to test if a string fits a pattern, outputs True/False, and stores matched parts.
Execution Sample
PowerShell
$text = 'Hello123'
if ($text -match '\d+') {
  $matches[0]
} else {
  'No match'
}
This code checks if $text contains digits and outputs the matched digits or 'No match'.
Execution Table
StepActionInputRegex PatternMatch ResultOutput$matches[0]
1Set variable $text'Hello123'
2Evaluate condition $text -match '\d+''Hello123'\d+True
3Store matched substring in $matches123
4Output matched substring123123
💡 Pattern '\d+' found digits in 'Hello123', so condition is True and matched substring '123' is output.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
$textundefined'Hello123''Hello123''Hello123'
$matchesundefinedundefined@{0='123'}@{0='123'}
Key Moments - 3 Insights
Why does the condition return True even though the whole string is not digits?
Because -match checks if any part of the string fits the pattern. Here '\d+' matches the '123' part inside 'Hello123' (see execution_table step 2).
What is stored in $matches after a successful match?
$matches[0] stores the exact substring that matched the pattern. In this example, it is '123' (see execution_table step 3).
What happens if the pattern does not match any part of the string?
The condition returns False, and $matches is not updated. The else branch runs (not shown here but implied).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of $matches[0] after step 3?
A'Hello123'
B'123'
C'' (empty string)
DUndefined
💡 Hint
Check the 'Match Result' and '$matches[0]' columns in execution_table row for step 3.
At which step does the condition $text -match '\d+' evaluate to True?
AStep 1
BStep 3
CStep 2
DStep 4
💡 Hint
Look at the 'Match Result' column in execution_table for each step.
If $text was 'Hello' (no digits), what would the output be?
A'No match'
B'' (empty string)
C'Hello'
D'123'
💡 Hint
Recall that if -match fails, the else branch outputs 'No match' as per execution_sample.
Concept Snapshot
PowerShell -match tests if a string fits a regex pattern.
Returns True if any part matches, else False.
Matched substring stored in $matches[0].
Use $matches to access matched text.
Example: 'abc123' -match '\d+' is True, $matches[0] = '123'.
Full Transcript
This lesson shows how PowerShell uses the -match operator to check if a string contains a pattern defined by a regular expression. The process starts by setting a string variable. Then, the -match operator tests if the string contains digits using the pattern '\d+'. If the pattern is found anywhere in the string, the condition returns True. The matched substring is saved in the automatic variable $matches at index 0. Finally, the matched substring is output. If no match is found, the condition returns False and the else branch runs. This helps beginners understand how to find patterns inside strings and use the matched parts for further work.

Practice

(1/5)
1. What does the -match operator do in PowerShell?
easy
A. Converts a string to uppercase
B. Replaces text in a string
C. Splits a string into an array
D. Checks if a string fits a pattern using regular expressions

Solution

  1. Step 1: Understand the purpose of -match

    The -match operator is used to test if a string matches a regular expression pattern.
  2. Step 2: Compare with other string operations

    Replacing text uses -replace, splitting uses -split, and uppercase conversion uses ToUpper(). These are different from -match.
  3. Final Answer:

    Checks if a string fits a pattern using regular expressions -> Option D
  4. Quick Check:

    -match = pattern check [OK]
Hint: Remember: -match means 'does it fit the pattern?' [OK]
Common Mistakes:
  • Confusing -match with -replace or -split
  • Thinking -match changes the string
  • Assuming -match returns the matched text directly
2. Which of the following is the correct syntax to check if the variable $text contains the word 'hello' using -match?
easy
A. if ($text contains 'hello')
B. match $text 'hello'
C. $text -match 'hello'
D. $text =~ 'hello'

Solution

  1. Step 1: Recall PowerShell -match syntax

    The correct syntax is $variable -match 'pattern' to test if the variable matches the pattern.
  2. Step 2: Evaluate each option

    $text -match 'hello' uses the correct syntax. match $text 'hello' is invalid syntax. $text =~ 'hello' uses a Bash-like operator, not PowerShell. if ($text contains 'hello') uses a wrong operator for matching.
  3. Final Answer:

    $text -match 'hello' -> Option C
  4. Quick Check:

    Correct syntax = $text -match 'hello' [OK]
Hint: Use $var -match 'pattern' to test matches [OK]
Common Mistakes:
  • Using Bash or other language operators like =~
  • Writing match before the variable
  • Using 'contains' instead of -match
3. What will be the output of this PowerShell code?
$text = 'My phone number is 123-456-7890'
if ($text -match '\d{3}-\d{3}-\d{4}') {
  $matches[0]
} else {
  'No match'
}
medium
A. No match
B. 123-456-7890
C. \d{3}-\d{3}-\d{4}
D. My phone number is 123-456-7890

Solution

  1. Step 1: Understand the regex pattern

    The pattern \d{3}-\d{3}-\d{4} matches a phone number format with three digits, a dash, three digits, a dash, and four digits.
  2. Step 2: Check if the string matches and what $matches[0] contains

    The string contains '123-456-7890' which matches the pattern. $matches[0] holds the matched substring, so it outputs '123-456-7890'.
  3. Final Answer:

    123-456-7890 -> Option B
  4. Quick Check:

    Regex match found = matched text [OK]
Hint: Matched text is in $matches[0] after -match success [OK]
Common Mistakes:
  • Expecting the whole string instead of matched part
  • Confusing $matches with the pattern string
  • Not escaping backslashes properly
4. Identify the error in this PowerShell snippet:
$text = 'Error code: 404'
if ($text -match '\d{3}') {
  Write-Output $matches
}
medium
A. You must use $matches[0] to get the matched string
B. The regex pattern is invalid
C. $matches is an automatic variable, no error here
D. You need to use -like instead of -match

Solution

  1. Step 1: Understand $matches variable usage

    $matches is a hashtable holding matched groups. To get the matched string, you must access $matches[0].
  2. Step 2: Analyze the code output

    Using Write-Output $matches prints the whole hashtable, not the matched string. To print the matched text, use Write-Output $matches[0].
  3. Final Answer:

    You must use $matches[0] to get the matched string -> Option A
  4. Quick Check:

    Print matched text with $matches[0] [OK]
Hint: Use $matches[0] to print matched text, not $matches alone [OK]
Common Mistakes:
  • Printing $matches directly instead of $matches[0]
  • Thinking $matches is a string, not a hashtable
  • Confusing -match with -like operator
5. You want to extract all email addresses from a list of strings stored in $lines. Which PowerShell snippet correctly uses -match and $matches to collect emails into $emails?
hard
A. $emails = foreach ($line in $lines) { if ($line -match '[\w.-]+@[\w.-]+\.\w+') { $matches[0] } }
B. $emails = $lines -match '[\w.-]+@[\w.-]+\.\w+'
C. $emails = $lines | Where-Object { $_ -contains '[\w.-]+@[\w.-]+\.\w+' }
D. $emails = foreach ($line in $lines) { $line -match '[\w.-]+@[\w.-]+\.\w+' }

Solution

  1. Step 1: Understand how to loop and match each line

    We must check each line with -match and if it matches, collect the matched email from $matches[0].
  2. Step 2: Evaluate each option

    $emails = foreach ($line in $lines) { if ($line -match '[\w.-]+@[\w.-]+\.\w+') { $matches[0] } } loops through lines, tests with -match, and collects matched emails correctly. $emails = $lines -match '[\w.-]+@[\w.-]+\.\w+' tries to match the whole array at once, which doesn't work. $emails = $lines | Where-Object { $_ -contains '[\w.-]+@[\w.-]+\.\w+' } uses -contains which does not support regex. $emails = foreach ($line in $lines) { $line -match '[\w.-]+@[\w.-]+\.\w+' } runs -match but does not collect matched emails.
  3. Final Answer:

    $emails = foreach ($line in $lines) { if ($line -match '[\w.-]+@[\w.-]+\.\w+') { $matches[0] } } -> Option A
  4. Quick Check:

    Loop + -match + $matches[0] collects matches [OK]
Hint: Use foreach + if (-match) + $matches[0] to collect matches [OK]
Common Mistakes:
  • Trying to match the whole array at once
  • Using -contains instead of -match for regex
  • Not collecting $matches[0] inside the loop
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard