VOOZH about

URL: https://apidock.com/ruby/String/scan

⇱ String#scan - APIdock


method

scan

ruby latest stable - Class: String
scan(p1)
public

Both forms iterate through str, matching the pattern (which may be a Regexp or a String). For each match, a result is generated and either added to the result array or passed to the block. If the pattern contains no groups, each individual result consists of the matched string, $&. If the pattern contains groups, each individual result is itself an array containing one entry per group.

a = "cruel world"
a.scan(/\w+/) #=> ["cruel", "world"]
a.scan(/.../) #=> ["cru", "el ", "wor"]
a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]]
a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]

And the block form:

a.scan(/\w+/) {|w| print "<<#{w}>> " }
print "\n"
a.scan(/(.)(.)/) {|x,y| print y, x }
print "\n"

produces:

<<cruel>> <<world>>
rceu lowlr
static VALUE
rb_str_scan(VALUE str, VALUE pat)
{
 VALUE result;
 long start = 0;
 long last = -1, prev = 0;
 char *p = RSTRING_PTR(str); long len = RSTRING_LEN(str);

 pat = get_pat_quoted(pat, 1);
 mustnot_broken(str);
 if (!rb_block_given_p()) {
 VALUE ary = rb_ary_new();

 while (!NIL_P(result = scan_once(str, pat, &start, 0))) {
 last = prev;
 prev = start;
 rb_ary_push(ary, result);
 }
 if (last >= 0) rb_pat_search(pat, str, last, 1);
 else rb_backref_set(Qnil);
 return ary;
 }

 while (!NIL_P(result = scan_once(str, pat, &start, 1))) {
 last = prev;
 prev = start;
 rb_yield(result);
 str_mod_check(str, p, len);
 }
 if (last >= 0) rb_pat_search(pat, str, last, 1);
 return str;
}

Related methods