📖 Scenario: You work in a small company and need to filter a list of email addresses to find only those from a specific domain.
🎯 Goal: Build a PowerShell script that uses the -match operator with a regular expression to find email addresses ending with @example.com.
📋 What You'll Learn
Create a list of email addresses in a variable called emails.
Create a regular expression pattern variable called pattern to match emails ending with @example.com.
Use a foreach loop to check each email with -match and collect matching emails in a list called matchedEmails.
Print the list of matched emails.
💡 Why This Matters
🌍 Real World
Filtering email lists is common in marketing, IT, and customer support to target or exclude specific groups.
💼 Career
Knowing how to use regular expressions with PowerShell helps automate text processing tasks in system administration and data management roles.
Progress0 / 4 steps
1
Create the list of email addresses
Create a variable called emails and assign it an array with these exact email addresses: "alice@example.com", "bob@test.com", "carol@example.com", "dave@work.com".
PowerShell
Hint
Use @() to create an array in PowerShell.
2
Create the regular expression pattern
Create a variable called pattern and assign it the string '@example\.com$' to match emails ending with @example.com.
PowerShell
Hint
Use \. to match a literal dot and $ to match the end of the string.
3
Filter emails using -match
Create an empty array called matchedEmails. Use a foreach loop with variable email to go through $emails. Inside the loop, use if ($email -match $pattern) to check if the email matches the pattern. If it matches, add $email to matchedEmails.
PowerShell
Hint
Use += to add items to an array in PowerShell.
4
Print the matched emails
Use Write-Output to print the $matchedEmails array.
PowerShell
Hint
Use Write-Output to show the results in PowerShell.
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
Step 1: Understand the purpose of -match
The -match operator is used to test if a string matches a regular expression pattern.
Step 2: Compare with other string operations
Replacing text uses -replace, splitting uses -split, and uppercase conversion uses ToUpper(). These are different from -match.
Final Answer:
Checks if a string fits a pattern using regular expressions -> Option D
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
Step 1: Recall PowerShell -match syntax
The correct syntax is $variable -match 'pattern' to test if the variable matches the pattern.
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.
Final Answer:
$text -match 'hello' -> Option C
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
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.
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'.
Final Answer:
123-456-7890 -> Option B
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
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
Step 1: Understand $matches variable usage
$matches is a hashtable holding matched groups. To get the matched string, you must access $matches[0].
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].
Final Answer:
You must use $matches[0] to get the matched string -> Option A
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] } }
D. $emails = foreach ($line in $lines) { $line -match '[\w.-]+@[\w.-]+\.\w+' }
Solution
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].
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.
Final Answer:
$emails = foreach ($line in $lines) { if ($line -match '[\w.-]+@[\w.-]+\.\w+') { $matches[0] } } -> Option A
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 unknownstrongwhile earning +1 Grip toward your certificate.