Bird
Raised Fist0
PowerShellscripting~10 mins

Named captures in PowerShell - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Named captures
Input string
↓
Apply regex with named groups
↓
Match found?
No→Exit: No match
Yes↓
Extract named groups
↓
Use named groups in script
The script applies a regex with named groups to a string, checks for a match, then extracts and uses the named groups.
Execution Sample
PowerShell
$text = 'Name: John, Age: 30'
if ($text -match 'Name: (?<name>\w+), Age: (?<age>\d+)') {
  "Name is $($matches['name']) and Age is $($matches['age'])"
}
This script extracts 'name' and 'age' from a string using named captures and prints them.
Execution Table
StepActionEvaluationResult
1Assign string to $text$text = 'Name: John, Age: 30'Variable $text holds 'Name: John, Age: 30'
2Apply regex with named groups to $text$text -match 'Name: (?<name>\w+), Age: (?<age>\d+)'Match found: True
3Extract named group 'name'$matches['name']'John'
4Extract named group 'age'$matches['age']'30'
5Output formatted string"Name is John and Age is 30"Printed: Name is John and Age is 30
💡 Regex match succeeds, named groups extracted, script outputs the formatted string.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
$textundefined'Name: John, Age: 30''Name: John, Age: 30''Name: John, Age: 30''Name: John, Age: 30''Name: John, Age: 30'
$matches['name']undefinedundefined'John''John''John''John'
$matches['age']undefinedundefined'30''30''30''30'
Key Moments - 2 Insights
Why does $matches['name'] contain 'John' instead of 'Name'?
The regex named group 'name' captures only the word characters (\w+) after 'Name: ', which is 'John'. See execution_table step 3.
What happens if the regex does not match the string?
The if condition fails, so the script does not extract named groups or print output. See execution_table step 2 where match is checked.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of $matches['age'] after step 4?
A'30'
B'John'
Cundefined
D'Age'
💡 Hint
Check the 'Result' column in execution_table row for step 4.
At which step does the script confirm the regex matched the string?
AStep 1
BStep 3
CStep 2
DStep 5
💡 Hint
Look at the 'Action' and 'Evaluation' columns in execution_table to find where match is checked.
If the input string was 'Name: Alice, Age: 25', what would $matches['name'] be after step 3?
A'John'
B'Alice'
C'Name'
Dundefined
💡 Hint
Refer to variable_tracker and understand how named captures extract the name from the string.
Concept Snapshot
Named captures in PowerShell regex use syntax (?<name>pattern).
Use -match operator to test and extract.
Matched groups are stored in $matches['name'].
Access named groups by their names for clarity.
Useful for extracting parts of strings cleanly.
Full Transcript
This example shows how to use named captures in PowerShell regex. We start with a string containing a name and age. We apply a regex with named groups 'name' and 'age' to extract these parts. The -match operator tests if the regex matches the string. If it does, the named groups are stored in the automatic $matches variable, accessible by their names. We then print a formatted string using these extracted values. This method helps to clearly get parts of strings without counting positions.

Practice

(1/5)
1. What does a named capture group do in a PowerShell regex pattern like (?<year>\d{4})?
easy
A. Matches only the first 4 characters of the string
B. Makes the regex case-insensitive
C. Repeats the pattern 4 times
D. Labels the matched part as 'year' for easy access later

Solution

  1. Step 1: Understand named capture syntax

    The syntax (?<name>pattern) labels the matched text as 'name'.
  2. Step 2: Identify the purpose in the example

    Here, (?<year>\d{4}) captures 4 digits and labels them 'year'.
  3. Final Answer:

    Labels the matched part as 'year' for easy access later -> Option D
  4. Quick Check:

    Named capture = label matched text [OK]
Hint: Look for (?<name>pattern) to label matches [OK]
Common Mistakes:
  • Thinking it changes match behavior
  • Confusing with quantifiers
  • Assuming it matches only start of string
2. Which of the following is the correct syntax to create a named capture group called 'day' matching two digits in PowerShell regex?
easy
A. (day:\d{2})
B. (?day:\d{2})
C. (?<day>\d{2})
D. (?P<day>\d{2})

Solution

  1. Step 1: Recall PowerShell named capture syntax

    PowerShell uses (?<name>pattern) for named captures.
  2. Step 2: Match the correct option

    (?<day>\d{2}) uses (?<day>\d{2}), which is correct syntax for two digits named 'day'.
  3. Final Answer:

    (?<day>\d{2}) -> Option C
  4. Quick Check:

    PowerShell named capture = (?<name>pattern) [OK]
Hint: Use (?<name>pattern) for named groups in PowerShell [OK]
Common Mistakes:
  • Using Python or other language syntax
  • Omitting the question mark
  • Using colon instead of angle brackets
3. What will be the output of this PowerShell code?
$text = 'Date: 2023-07-15'
if ($text -match '(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})') {
  "$($matches['year'])/$($matches['month'])/$($matches['day'])"
} else {
  'No match'
}
medium
A. "2023/07/15"
B. "Date: 2023-07-15"
C. "No match"
D. "2023-07-15"

Solution

  1. Step 1: Understand the regex and matching

    The regex captures year, month, and day as named groups from the string 'Date: 2023-07-15'.
  2. Step 2: Access named captures in $matches

    After matching, $matches['year'] = '2023', $matches['month'] = '07', $matches['day'] = '15'. The output formats them as "2023/07/15".
  3. Final Answer:

    "2023/07/15" -> Option A
  4. Quick Check:

    Named captures accessed = formatted date [OK]
Hint: Use $matches['name'] to get named group values [OK]
Common Mistakes:
  • Expecting original string output
  • Using $matches.year instead of $matches['year']
  • Not matching regex correctly
4. Identify the error in this PowerShell snippet using named captures:
$text = 'User: JohnDoe'
if ($text -match '(?<user>\w+)') {
  Write-Output $matches.user
}
medium
A. Incorrect property access; should use $matches['user']
B. Regex pattern is invalid
C. Variable $text is not defined
D. Missing closing parenthesis in if statement

Solution

  1. Step 1: Check regex and variable definitions

    The regex and $text variable are correct and properly defined.
  2. Step 2: Identify how to access named captures

    In PowerShell, named captures are accessed as $matches['name'], not $matches.name.
  3. Final Answer:

    Incorrect property access; should use $matches['user'] -> Option A
  4. Quick Check:

    Access named capture with $matches['name'] [OK]
Hint: Use brackets $matches['name'], not dot notation [OK]
Common Mistakes:
  • Using dot notation for $matches named groups
  • Assuming regex is wrong
  • Ignoring variable initialization
5. You want to extract 'first' and 'last' names from a string like 'Name: Jane Doe' using named captures in PowerShell. Which script correctly captures and prints them as "Doe, Jane"?
hard
A.
$text = 'Name: Jane Doe'
if ($text -match 'Name: (?<last>\w+) (?<first>\w+)') {
  "$($matches['last']), $($matches['first'])"
}
B.
$text = 'Name: Jane Doe'
if ($text -match 'Name: (?<first>\w+) (?<last>\w+)') {
  "$($matches['last']), $($matches['first'])"
}
C.
$text = 'Name: Jane Doe'
if ($text -match 'Name: (\w+) (\w+)') {
  "$($matches['last']), $($matches['first'])"
}
D.
$text = 'Name: Jane Doe'
if ($text -match 'Name: (?<first>\w+) (?<last>\w+)') {
  "$($matches.first), $($matches.last)"
}

Solution

  1. Step 1: Check regex named capture order

    The pattern must capture first name then last name as named groups 'first' and 'last' respectively.
  2. Step 2: Verify output formatting and access

    Access named captures with $matches['name'] and print as "last, first".
    $text = 'Name: Jane Doe'
    if ($text -match 'Name: (?<first>\w+) (?<last>\w+)') {
      "$($matches['last']), $($matches['first'])"
    }
    does this correctly.
  3. Final Answer:

    The script correctly captures and prints "Doe, Jane" -> Option B
  4. Quick Check:

    Correct named capture order and access =
    $text = 'Name: Jane Doe'
    if ($text -match 'Name: (?<first>\w+) (?<last>\w+)') {
      "$($matches['last']), $($matches['first'])"
    }
    [OK]
Hint: Match names in order and use $matches['name'] to print [OK]
Common Mistakes:
  • Swapping first and last in regex
  • Using unnamed captures but accessing by name
  • Using dot notation for $matches
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