Common patterns and character classes in Ruby - Time & Space Complexity
When using common patterns and character classes in Ruby regular expressions, it's important to understand how the matching process scales as the input grows.
We want to know how the time to find matches changes when the text gets longer.
Analyze the time complexity of the following Ruby code snippet.
text = "a1b2c3d4e5"
pattern = /[a-z]\d/
matches = text.scan(pattern)
puts matches
This code finds all pairs where a lowercase letter is followed by a digit in the given text.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The scan method checks each position in the text to see if the pattern matches starting there.
- How many times: It tries matching at every character index, so roughly once per character in the text.
As the text gets longer, the number of checks grows roughly in direct proportion to the text length.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The work grows steadily as the input grows, roughly one check per character.
Time Complexity: O(n)
This means the time to find matches grows in a straight line with the size of the input text.
[X] Wrong: "Using character classes makes the search instant regardless of input size."
[OK] Correct: Even with character classes, the program still checks each position in the text, so time grows with input length.
Understanding how pattern matching scales helps you write efficient code and explain your reasoning clearly in interviews.
"What if the pattern included a quantifier like + or *? How would the time complexity change?"
Practice
Solution
Step 1: Understand \d in Ruby regex
The pattern \d matches any digit character (0-9).Step 2: Compare with other options
\w matches word characters (letters, digits, underscore), \s matches whitespace, \D matches non-digit characters.Final Answer:
/\d/ -> Option BQuick Check:
Digit pattern = /\d/ [OK]
- Confusing \d with \w
- Using /\D/ which matches non-digits
- Thinking \s matches digits
Solution
Step 1: Understand quantifiers in regex
+ means one or more times, * means zero or more, ? means zero or one.Step 2: Apply to \w
/\w+/ matches one or more word characters, which is the correct syntax.Final Answer:
/\w+/ -> Option AQuick Check:
One or more word chars = /\w+/ [OK]
- Using * which allows zero matches
- Using ? which allows zero or one match
- Using empty braces {} which is invalid
text = "Room 101" match = text.match(/\d+/) puts match[0]
Solution
Step 1: Understand the regex /\d+/
This pattern matches one or more digits in a row.Step 2: Apply match to string "Room 101"
The digits "101" are matched as a group, so match[0] returns "101".Final Answer:
101 -> Option AQuick Check:
Digits matched = 101 [OK]
- Thinking it matches only one digit
- Confusing match[0] with match object
- Expecting the word part instead of digits
email = "user@example.com" if email =~ /\w+@\w+.\w+/ puts "Valid email" else puts "Invalid email" end
Solution
Step 1: Examine the regex pattern
The pattern /\w+@\w+.\w+/ uses an unescaped . which matches any character, not a literal dot.Step 2: Identify the error
The dot after the domain must be escaped as \. to match the literal "." in email addresses.Final Answer:
The regex does not escape the dot properly -> Option CQuick Check:
Escape literal dot as \. [OK]
- Thinking dot doesn't need escaping
- Misusing =~ operator
- Confusing \w with \d in email regex
"Hello World from Ruby". Which Ruby regex pattern should you use with scan?Solution
Step 1: Understand the requirement
We want words starting with a capital letter, so first letter must be A-Z.Step 2: Analyze the regex options
/\b[A-Z]\w*/ matches word boundary, then capital letter, then zero or more word chars.Step 3: Check other options
/\b[a-z]\w*/ matches lowercase start, /\d+/ matches digits, /\s+/ matches spaces, so they don't fit.Final Answer:
/\b[A-Z]\w*/ -> Option DQuick Check:
Capital-start words = /\b[A-Z]\w*/ [OK]
- Using [a-z] instead of [A-Z]
- Forgetting word boundary \b
- Using digit or space patterns incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
