Bird
Raised Fist0
PowerShellscripting~10 mins

Named captures in PowerShell - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to capture the year from the date string using named captures.

PowerShell
$date = '2024-06-15'
if ($date -match '(?<year>\d{4})-\d{2}-\d{2}') {
    Write-Output $matches.[1]
}
Drag options to blanks, or click blank then click option'
Ayear
Bmonth
Cday
Ddate
Attempts:
3 left
💡 Hint
Common Mistakes
Using $matches.month or $matches.day which are not defined in the regex.
Trying to access $matches['year'] instead of $matches.year.
2fill in blank
medium

Complete the code to extract the 'name' from the string using named captures.

PowerShell
$text = 'Name: John Doe'
if ($text -match 'Name: (?<[1]>\w+ \w+)') {
    Write-Output $matches.name
}
Drag options to blanks, or click blank then click option'
Ausername
Bfullname
Cname
Dperson
Attempts:
3 left
💡 Hint
Common Mistakes
Using a different group name than 'name' causing $matches.name to be empty.
Forgetting to name the capture group.
3fill in blank
hard

Fix the error in the regex to correctly capture 'hour' as a named group.

PowerShell
$time = '13:45'
if ($time -match '(?<[1]>\d{2}):\d{2}') {
    Write-Output $matches.hour
}
Drag options to blanks, or click blank then click option'
Ahr
Bhour
Chours
Dh
Attempts:
3 left
💡 Hint
Common Mistakes
Using a different group name like 'hours' or 'hr' causing $matches.hour to be null.
Missing the named capture syntax.
4fill in blank
hard

Fill both blanks to capture 'day' and 'month' from the date string.

PowerShell
$date = '15/06/2024'
if ($date -match '(?<[1]>\d{2})/(?<[2]>\d{2})/\d{4}') {
    Write-Output "Day: $($matches.day), Month: $($matches.month)"
}
Drag options to blanks, or click blank then click option'
Aday
Byear
Cmonth
Ddate
Attempts:
3 left
💡 Hint
Common Mistakes
Swapping day and month group names.
Using incorrect group names that don't match $matches properties.
5fill in blank
hard

Fill all three blanks to capture 'first', 'middle', and 'last' names from the string.

PowerShell
$fullName = 'John Michael Doe'
if ($fullName -match '(?<[1]>\w+) (?<[2]>\w+) (?<[3]>\w+)') {
    Write-Output "First: $($matches.first), Middle: $($matches.middle), Last: $($matches.last)"
}
Drag options to blanks, or click blank then click option'
Afirst
Bmiddle
Clast
Dname
Attempts:
3 left
💡 Hint
Common Mistakes
Using generic group names like 'name' instead of specific ones.
Not matching group names to the variables used in Write-Output.

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