Bird
Raised Fist0
Rubyprogramming~15 mins

Named captures in Ruby - Mini Project: Build & Apply

Choose your learning style10 modes available
Extracting Date Components with Named Captures in Ruby
📖 Scenario: Imagine you have a list of dates in the format YYYY-MM-DD. You want to pull out the year, month, and day parts separately to use them later, like sorting or filtering.
🎯 Goal: Build a Ruby program that uses a regular expression with named captures to extract the year, month, and day from a date string.
📋 What You'll Learn
Create a string variable called date with the value "2024-06-15".
Create a regular expression called date_regex that uses named captures for year, month, and day matching the date format.
Use the match method to match date against date_regex and store the result in a variable called match_data.
Print the extracted year, month, and day from match_data using the named captures.
💡 Why This Matters
🌍 Real World
Named captures help you pull out meaningful parts from text like dates, phone numbers, or codes, making it easier to work with data.
💼 Career
Many jobs require processing text data. Knowing how to use named captures in regex helps you write clear and maintainable code for data extraction.
Progress0 / 4 steps
1
Create the date string
Create a string variable called date and set it to "2024-06-15".
Ruby
Hint

Use = to assign the string to the variable date.

2
Create the named capture regex
Create a regular expression variable called date_regex that matches the format YYYY-MM-DD using named captures for year, month, and day. Use the syntax /(?\d{4})-(?\d{2})-(?\d{2})/.
Ruby
Hint

Use /.../ to create the regex and ? for named captures.

3
Match the date string with the regex
Use the match method to match date against date_regex and assign the result to a variable called match_data. Use match_data = date_regex.match(date).
Ruby
Hint

Use the match method on the regex to get the match data.

4
Print the extracted year, month, and day
Print the year, month, and day from match_data using the named captures. Use puts match_data[:year], puts match_data[:month], and puts match_data[:day].
Ruby
Hint

Use puts to print each part on its own line.

Practice

(1/5)
1. What does a named capture group in Ruby regex do?
/(?<name>pattern)/
easy
A. Repeats the pattern multiple times
B. Makes the regex case-insensitive
C. Labels a part of the matched text with a name for easy access
D. Matches only digits in the text

Solution

  1. Step 1: Understand named capture syntax

    The syntax ?<name> inside parentheses names the capture group.
  2. Step 2: Purpose of named captures

    This lets you access matched parts by name instead of number, making code clearer.
  3. Final Answer:

    Labels a part of the matched text with a name for easy access -> Option C
  4. Quick Check:

    Named capture = label matched text [OK]
Hint: Named captures label groups for easy access by name [OK]
Common Mistakes:
  • Confusing named captures with regex flags
  • Thinking named captures repeat patterns
  • Assuming named captures only match digits
2. Which of the following is the correct syntax for a named capture group in Ruby regex?
easy
A. /<year>\d{4}/
B. /(?year>\d{4})/
C. /(?/
D. /(?<year>\d{4})/

Solution

  1. Step 1: Recall named capture syntax

    Named captures use ?<name> inside parentheses to name the group.
  2. Step 2: Check each option

    /(?<year>\d{4})/ correctly uses (?<year>\d{4}). Others miss brackets or have wrong syntax.
  3. Final Answer:

    /(?<year>\d{4})/ is correct syntax -> Option D
  4. Quick Check:

    Correct syntax = (?<name>) [OK]
Hint: Look for parentheses with ?<name> inside [OK]
Common Mistakes:
  • Omitting angle brackets around the name
  • Placing name outside parentheses
  • Using wrong brackets or missing parentheses
3. What is the output of this Ruby code?
text = "Date: 2024-06-15"
regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
m = text.match(regex)
puts "Year: #{m[:year]}, Month: #{m[:month]}, Day: #{m[:day]}"
medium
A. Year: 2024, Month: 06, Day: 15
B. Year: , Month: , Day:
C. Year: 2024-06-15, Month: 2024-06-15, Day: 2024-06-15
D. Error: undefined method [] for nil

Solution

  1. Step 1: Match regex with named captures

    The regex captures year, month, and day parts from the text "Date: 2024-06-15".
  2. Step 2: Access named captures from match object

    Using m[:year], m[:month], and m[:day] returns "2024", "06", and "15" respectively.
  3. Final Answer:

    Year: 2024, Month: 06, Day: 15 -> Option A
  4. Quick Check:

    Named captures return parts by name [OK]
Hint: Use m[:name] to get named capture values [OK]
Common Mistakes:
  • Using m['name'] instead of m[:name]
  • Forgetting to call match before accessing captures
  • Expecting full match instead of named parts
4. Find the error in this Ruby code using named captures:
text = "User: alice, Age: 30"
regex = /User: (?<name>\w+), Age: (?<age>\d+)/
m = regex.match(text)
puts "Name: #{m['name']}, Age: #{m['age']}"
medium
A. Regex pattern missing parentheses
B. Using string keys instead of symbols to access named captures
C. Match method called on regex instead of string
D. No error, code runs fine

Solution

  1. Step 1: Check how named captures are accessed

    Named captures in Ruby match objects are accessed with symbols, like m[:name], not strings.
  2. Step 2: Identify the error in code

    The code uses m['name'] and m['age'], which causes a nil result or error.
  3. Final Answer:

    Using string keys instead of symbols to access named captures -> Option B
  4. Quick Check:

    Use symbols, not strings, for named captures [OK]
Hint: Access named captures with symbols like m[:name] [OK]
Common Mistakes:
  • Using string keys instead of symbols
  • Confusing match method call on regex vs string
  • Missing parentheses in regex groups
5. Given this text:
"Order #1234: 5 items, total $99.95"
Write a Ruby regex with named captures to extract order number, item count, and total price.
Which regex correctly captures these parts?
hard
A. /Order #(?<order_num>\d+): (?<items>\d+) items, total \$(?<total>\d+\.\d{2})/
B. /Order #(?<order_num>\d+), (?<items>\d+) items total \$(?<total>\d+\.\d{2})/
C. /Order #(?<order_num>\d+): (?<items>\d+) items total \$(?<total>\d+\.\d{2})/
D. /Order #(?<order_num>\d+): (?<items>\d+) items, total \$(?<total>\d+\.\d{3})/

Solution

  1. Step 1: Analyze the text format

    The text is "Order #1234: 5 items, total $99.95" with colon and comma exactly as shown.
  2. Step 2: Match regex parts carefully

    /Order #(?<order_num>\d+): (?<items>\d+) items, total \$(?<total>\d+\.\d{2})/ matches colon after order number, space, number of items, comma, space, "total $", and price with two decimals.
  3. Step 3: Check other options

    Options A and C miss the comma or colon or both, and /Order #(?<order_num>\d+): (?<items>\d+) items, total \$(?<total>\d+\.\d{3})/ expects three decimals instead of two.
  4. Final Answer:

    /Order #(?<order_num>\d+): (?<items>\d+) items, total \$(?<total>\d+\.\d{2})/ -> Option A
  5. Quick Check:

    Match exact punctuation and decimal places [OK]
Hint: Match exact punctuation and decimal digits in regex [OK]
Common Mistakes:
  • Missing colon or comma in pattern
  • Wrong decimal places in price capture
  • Using incorrect group names or syntax
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