What if you could find every hidden word in a text with just one simple command?
Why Scan for all matches in Ruby? - Purpose & Use Cases
Imagine you have a long paragraph and you want to find every time a certain word appears. Doing this by reading and checking each word one by one is like searching for a needle in a haystack by hand.
Manually checking each word is slow and tiring. You might miss some matches or count some twice. It's easy to make mistakes and it takes a lot of time, especially if the text is very long.
Using the scan method in Ruby lets you quickly find all matches of a pattern in a string. It does the hard work for you, returning all matches at once, so you don't have to check each word yourself.
words = text.split(' ') matches = [] words.each do |word| matches << word if word == 'ruby' end
matches = text.scan(/ruby/)
It makes finding all occurrences of a pattern in text fast, easy, and error-free.
Say you want to find every hashtag in a tweet. Using scan, you can grab all hashtags instantly without missing any.
Manually searching text is slow and error-prone.
scan finds all matches quickly and accurately.
This saves time and reduces mistakes when working with text.
Practice
scan do when used on a string?Solution
Step 1: Understand the purpose of
Thescanscanmethod searches the string for all occurrences of a pattern.Step 2: Identify the return value of
It returns an array containing all matched parts of the string.scanFinal Answer:
It finds all matches of a pattern and returns them in an array. -> Option CQuick Check:
scanreturns matches array [OK]
- Confusing scan with gsub (replacement)
- Thinking scan returns a count
- Assuming scan modifies the original string
str using scan?Solution
Step 1: Recognize the correct regex syntax in Ruby
Ruby uses forward slashes/pattern/to denote regular expressions.Step 2: Identify the correct regex for digits
\d+matches one or more digits. The pattern must be inside slashes for regex.Final Answer:
str.scan(/\d+/) -> Option DQuick Check:
Regex in slashes with \d+ = str.scan(/\d+/) [OK]
- Using string quotes instead of regex slashes
- Missing escape backslash in regex
- Using incorrect regex delimiters
text = "cat bat rat" matches = text.scan(/.at/) puts matches.inspect
Solution
Step 1: Understand the regex
The dot/.at/.matches any single character, so.atmatches any three-letter word ending with 'at'.Step 2: Apply
The string "cat bat rat" contains "cat", "bat", and "rat" which all match the pattern.scanon the stringFinal Answer:
["cat", "bat", "rat"] -> Option BQuick Check:
scan finds all 3-letter words ending with 'at' [OK]
- Thinking dot matches zero or multiple chars
- Expecting partial matches like 'at' only
- Confusing scan output with string split
sentence. What is the error?
sentence = "apple banana apricot avocado"
words = sentence.scan("a\w+")
puts words.inspectSolution
Step 1: Check the argument type for
Thescanscanmethod expects a regex pattern, not a plain string.Step 2: Identify correct regex usage
The pattern should be written as/a\w+/to match words starting with 'a'.Final Answer:
The pattern should be a regex, not a string. -> Option AQuick Check:
scan requires regex pattern, not string [OK]
- Passing string instead of regex to scan
- Misunderstanding backslash escaping
- Assuming scan modifies the string
data = "log12 ID123, ID456, ID789", how can you use scan to extract only the numeric parts after each 'ID' (e.g., ["123", "456", "789"])?Solution
Step 1: Understand the pattern to extract numbers after 'ID'
The regex/ID(\d+)/matches 'ID' followed by digits, capturing only digits in parentheses. This ignores other digits like '12' in 'log12'.Step 2: Use
scanand flatten the resultscanreturns an array of arrays for capture groups, soflattenconverts it to a simple array of strings.Final Answer:
data.scan(/ID(\d+)/).flatten -> Option AQuick Check:
Capture group extracts digits, flatten simplifies array [OK]
- Using data.scan(/\d+/) which grabs all digits including extras like '12' and '78'
- Using scan without flatten, getting nested arrays
- Matching full 'ID123' instead of just digits
Ready to prove it?
Pass the test and this pattern moves unknown
