Project

General

Profile

Actions

Feature #5749

open

new method String#match_all needed

Added by yimutang (Joey Zhou) over 12 years ago. Updated over 6 years ago.

Status:
Assigned
Target version:
-
[ruby-core:41603]

Description

The String class should contain an instance method 'match_all', which is a mixture of 'match' and 'scan'.

The method 'scan' is not a very powerful tool, its result(the yielding thing) is just a matched string or an array of captured strings.

p 'a1bc2de3f'.scan(/(.)\d(.)/) # [["a", "b"], ["c", "d"], ["e", "f"]]

If the regex argument contains groups, I even cannot get the whole matched string, and no information about the matched offsets.

So, a 'match_all' is very necessary. It scan the string, finding every matched, and yielding MatchData instance to the following block.

Here's a simple implemention in Ruby:

class String
def match_all(re,i=0)
if block_given?
while m = self.match(re,i)
yield m
i = m.end(0)
end
return self
else
ary = []
while m = self.match(re,i)
ary << m
i = m.end(0)
end
return ary
end
end
end

However, it is not efficient in the 'while m = self.match(re,i)' way, because it scan the string again and again. If string is UTF8-encoded and contains out-of-ASCII characters, I'm afraid getting the start index of it is so expensive.

So, I think a built-in 'match_all' method, which behaves just like 'scan' but yield MatchData, is needed.

Please consider it, thank you!


Related issues 3 (1 open2 closed)

Related to Ruby master - Feature #5606: String#each_match(regexp)FeedbackActions
Related to Ruby master - Feature #6802: String#scan should have equivalent yielding MatchDataAssignedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #12745: String#(g)sub(!) should pass a MatchData to the block, not a StringFeedbackmatz (Yukihiro Matsumoto)Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0