Project

General

Profile

Feature #11309

Iterator over string matches

Added by sawa (Tsuyoshi Sawada) about 4 years ago. Updated about 4 years ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:69743]

Description

This was hinted from a problem in stackoverflow (http://stackoverflow.com/questions/31074050/build-list-of-strings-containing-substrings-separated-by-an-from-a-string/31075511#31075511).

Suppose there is a string:

s = "a_b_c_d_e"

To get an array of pre-matches that result from matching s with "_", I can do this:

a = []
s.scan("_"){a.push($`)}
a # => ["a", "a_b", "a_b_c", "a_b_c_d"]

But this looks too Perlish. I thought it would be nice if there is a method on String that creates an enumerator over matches so that I can do something like this:

"a_b_c_d_e".some_method("_").with_object([]){|m, a| a.push(m.post_match)}
# => ["a", "a_b", "a_b_c", "a_b_c_d"]

where m is the last matchdata instance at that point. I believe such method would have wider application.

History

Updated by sawa (Tsuyoshi Sawada) about 4 years ago

Oops, I meant pre_match, not post_match. Sorry.

Updated by duerst (Martin Dürst) about 4 years ago

What do you think looks too Perlish? Is it just the $`?

In that case, having something like $MATCH (as an alias to $~) might help:

"a_b_c_d_e".scan("").with_object([]) { |, a| a.push $MATCH.post_match }

Even without that,

"a_b_c_d_e".scan("").with_object([]) { |, a| a.push $~.post_match }

is quite readable, because "post_match" makes it easy to understand that $~ must be the current match.

Updated by sawa (Tsuyoshi Sawada) about 4 years ago

Martin Dürst wrote:

What do you think looks too Perlish? Is it just the $`?

That is one. But a more severe one is that (I thought) I had to initialize a = [] in a separate line.

"a_b_c_d_e".scan("").with_object([]) { |, a| a.push $MATCH.post_match }
"a_b_c_d_e".scan("").with_object([]) { |, a| a.push $~.post_match }

These are better. But I still don't like the fact that I have to access a global variable.

Also available in: Atom PDF