String#partition
static VALUE
rb_str_partition(VALUE str, VALUE sep)
{
long pos;
sep = get_pat_quoted(sep, 0);
if (RB_TYPE_P(sep, T_REGEXP)) {
if (rb_reg_search(sep, str, 0, 0) < 0) {
goto failed;
}
VALUE match = rb_backref_get();
struct re_registers *regs = RMATCH_REGS(match);
pos = BEG(0);
sep = rb_str_subseq(str, pos, END(0) - pos);
}
else {
pos = rb_str_index(str, sep, 0);
if (pos < 0) goto failed;
}
return rb_ary_new3(3, rb_str_subseq(str, 0, pos),
sep,
rb_str_subseq(str, pos+RSTRING_LEN(sep),
RSTRING_LEN(str)-pos-RSTRING_LEN(sep)));
failed:
return rb_ary_new3(3, str_duplicate(rb_cString, str), str_new_empty_String(str), str_new_empty_String(str));
}
Returns a 3-element array of substrings of self.
If pattern is matched, returns the array:
[pre_match, first_match, post_match]
where:
-
first_matchis the first-found matching substring. -
pre_matchandpost_matchare the preceding and following substrings.
If pattern is not matched, returns the array:
[self.dup, "", ""]
Note that in the examples below, a returned string 'hello' is a copy of self, not self.
If pattern is a Regexp, performs the equivalent of self.match(pattern) (also setting matched-data variables):
'hello'.partition(/h/) # => ["", "h", "ello"] 'hello'.partition(/l/) # => ["he", "l", "lo"] 'hello'.partition(/l+/) # => ["he", "ll", "o"] 'hello'.partition(/o/) # => ["hell", "o", ""] 'hello'.partition(/^/) # => ["", "", "hello"] 'hello'.partition(//) # => ["", "", "hello"] 'hello'.partition(/$/) # => ["hello", "", ""] 'hello'.partition(/x/) # => ["hello", "", ""]
If pattern is not a Regexp, converts it to a string (if it is not already one), then performs the equivalent of self.index(pattern) (and does not set matched-data global variables):
'hello'.partition('h') # => ["", "h", "ello"] 'hello'.partition('l') # => ["he", "l", "lo"] 'hello'.partition('ll') # => ["he", "ll", "o"] 'hello'.partition('o') # => ["hell", "o", ""] 'hello'.partition('') # => ["", "", "hello"] 'hello'.partition('x') # => ["hello", "", ""] 'тест'.partition('т') # => ["", "т", "ест"] 'こんにちは'.partition('に') # => ["こん", "に", "ちは"]
Related: see Converting to Non-String.
Ruby version changes
-
3.0
-
The following methods now return or yield
Stringinstances instead of subclass instances when called on subclass instances: [Bug #10845]
-