Class
A String object has an arbitrary sequence of bytes, typically representing text or binary data. A String object may be created using String::new or as literals.
String objects differ from Symbol objects in that Symbol objects are designed to be used as identifiers, instead of text or data.
You can create a String object explicitly with:
-
A string literal.
-
A heredoc literal.
You can convert certain objects to Strings with:
Some String methods modify self. Typically, a method whose name ends with ! modifies self and returns self; often, a similarly named method (without the !) returns a new string.
In general, if both bang and non-bang versions of a method exist, the bang method mutates and the non-bang method does not. However, a method without a bang can also mutate, such as String#replace.
Substitution Methods
These methods perform substitutions:
-
String#sub: One substitution (or none); returns a new string. -
String#sub!: One substitution (or none); returnsselfif any changes,nilotherwise. -
String#gsub: Zero or more substitutions; returns a new string. -
String#gsub!: Zero or more substitutions; returnsselfif any changes,nilotherwise.
Each of these methods takes:
-
A first argument,
pattern(StringorRegexp), that specifies the substring(s) to be replaced. -
Either of the following:
The examples in this section mostly use the String#sub and String#gsub methods; the principles illustrated apply to all four substitution methods.
Argument pattern
Argument pattern is commonly a regular expression:
s = 'hello' s.sub(/[aeiou]/, '*') s.gsub(/[aeiou]/, '*') s.gsub(/[aeiou]/, '') s.sub(/ell/, 'al') s.gsub(/xyzzy/, '*') 'THX1138'.gsub(/\d+/, '00')
When pattern is a string, all its characters are treated as ordinary characters (not as Regexp special characters):
'THX1138'.gsub('\d+', '00')
String replacement
If replacement is a string, that string determines the replacing string that is substituted for the matched text.
Each of the examples above uses a simple string as the replacing string.
String replacement may contain back-references to the pattern’s captures:
-
\n(n is a non-negative integer) refers to$n. -
\k<name>refers to the named capturename.
See Regexp for details.
Note that within the string replacement, a character combination such as $& is treated as ordinary text, not as a special match variable. However, you may refer to some special match variables using these combinations:
-
\&and\0correspond to$&, which contains the complete matched text. -
\'corresponds to$', which contains the string after the match. -
`corresponds to$`, which contains the string before the match. -
\+corresponds to$+, which contains the last capture group.
See Regexp for details.
Note that \\ is interpreted as an escape, i.e., a single backslash.
Note also that a string literal consumes backslashes. See String Literals for details about string literals.
A back-reference is typically preceded by an additional backslash. For example, if you want to write a back-reference \& in replacement with a double-quoted string literal, you need to write "..\\&..".
If you want to write a non-back-reference string \& in replacement, you need to first escape the backslash to prevent this method from interpreting it as a back-reference, and then you need to escape the backslashes again to prevent a string literal from consuming them: "..\\\\&..".
You may want to use the block form to avoid excessive backslashes.
Hash replacement
If the argument replacement is a hash, and pattern matches one of its keys, the replacing string is the value for that key:
h = {'foo' => 'bar', 'baz' => 'bat'} 'food'.sub('foo', h)
Note that a symbol key does not match:
h = {foo: 'bar', baz: 'bat'} 'food'.sub('foo', h)
Block
In the block form, the current match string is passed to the block; the block’s return value becomes the replacing string:
s = '@' '1234'.gsub(/\d/) { |match| s.succ! }
Special match variables such as $1, $2, $`, $&, and $' are set appropriately.
Whitespace in Strings
In the class String, whitespace is defined as a contiguous sequence of characters consisting of any mixture of the following:
-
NL (null):
"\x00","\u0000". -
HT (horizontal tab):
"\x09","\t". -
LF (line feed):
"\x0a","\n". -
VT (vertical tab):
"\x0b","\v". -
FF (form feed):
"\x0c","\f". -
CR (carriage return):
"\x0d","\r". -
SP (space):
"\x20"," ".
Whitespace is relevant for the following methods:
What’s Here
First, what’s elsewhere. Class String:
-
Inherits from the Object class.
-
Includes the Comparable module.
Here, class String provides methods that are useful for:
Creating a String
-
::new: Returns a new string. -
::try_convert: Returns a new string created from a given object.
Freezing/Unfreezing
-
+@: Returns a string that is not frozen:selfif not frozen;self.dupotherwise. -
-@(aliased asdedup): Returns a string that is frozen:selfif already frozen;self.freezeotherwise. -
freeze: Freezesselfif not already frozen; returnsself.
Querying
Counts
-
bytesize: Returns the count of bytes. -
count: Returns the count of substrings matching given strings. -
empty?: Returns whether the length ofselfis zero. -
length(aliased assize): Returns the count of characters (not bytes).
Substrings
-
=~: Returns the index of the first substring that matches a givenRegexpor other object; returnsnilif no match is found. -
byteindex: Returns the byte index of the first occurrence of a given substring. -
byterindex: Returns the byte index of the last occurrence of a given substring. -
index: Returns the index of the first occurrence of a given substring; returnsnilif none found. -
rindex: Returns the index of the last occurrence of a given substring; returnsnilif none found. -
include?: Returnstrueif the string contains a given substring;falseotherwise. -
match: Returns aMatchDataobject if the string matches a givenRegexp;nilotherwise. -
match?: Returnstrueif the string matches a givenRegexp;falseotherwise. -
start_with?: Returnstrueif the string begins with any of the given substrings. -
end_with?: Returnstrueif the string ends with any of the given substrings.
Encodings
-
encoding: Returns theEncodingobject that represents the encoding of the string. -
unicode_normalized?: Returnstrueif the string is in Unicode normalized form;falseotherwise. -
valid_encoding?: Returnstrueif the string contains only characters that are valid for its encoding. -
ascii_only?: Returnstrueif the string has only ASCII characters;falseotherwise.
Other
-
sum: Returns a basic checksum for the string: the sum of each byte. -
hash: Returns the integer hash code.
Comparing
-
==(aliased as===): Returnstrueif a given other string has the same content asself. -
eql?: Returnstrueif the content is the same as the given other string. -
<=>: Returns -1, 0, or 1 as a given other string is smaller than, equal to, or larger thanself. -
casecmp: Ignoring case, returns -1, 0, or 1 asselfis smaller than, equal to, or larger than a given other string. -
casecmp?: Ignoring case, returns whether a given other string is equal toself.
Modifying
Each of these methods modifies self.
Insertion
-
insert: Returnsselfwith a given string inserted at a specified offset. -
<<: Returnsselfconcatenated with a given string or integer. -
append_as_bytes: Returnsselfconcatenated with strings without performing any encoding validation or conversion. -
prepend: Prefixes toselfthe concatenation of given other strings.
Substitution
-
bytesplice: Replaces bytes ofselfwith bytes from a given string; returnsself. -
sub!: Replaces the first substring that matches a given pattern with a given replacement string; returnsselfif any changes,nilotherwise. -
gsub!: Replaces each substring that matches a given pattern with a given replacement string; returnsselfif any changes,nilotherwise. -
succ!(aliased asnext!): Returnsselfmodified to become its own successor. -
replace: Returnsselfwith its entire content replaced by a given string. -
reverse!: Returnsselfwith its characters in reverse order. -
setbyte: Sets the byte at a given integer offset to a given value; returns the argument. -
tr!: Replaces specified characters inselfwith specified replacement characters; returnsselfif any changes,nilotherwise. -
tr_s!: Replaces specified characters inselfwith specified replacement characters, removing duplicates from the substrings that were modified; returnsselfif any changes,nilotherwise.
Casing
-
capitalize!: Upcases the initial character and downcases all others; returnsselfif any changes,nilotherwise. -
downcase!: Downcases all characters; returnsselfif any changes,nilotherwise. -
upcase!: Upcases all characters; returnsselfif any changes,nilotherwise. -
swapcase!: Upcases each downcase character and downcases each upcase character; returnsselfif any changes,nilotherwise.
Encoding
-
encode!: Returnsselfwith all characters transcoded from one encoding to another. -
unicode_normalize!: Unicode-normalizesself; returnsself. -
scrub!: Replaces each invalid byte with a given character; returnsself. -
force_encoding: Changes the encoding to a given encoding; returnsself.
Deletion
-
clear: Removes all content, so thatselfis empty; returnsself. -
slice!,[]=: Removes a substring determined by a given index, start/length, range, regexp, or substring. -
squeeze!: Removes contiguous duplicate characters; returnsself. -
delete!: Removes characters as determined by the intersection of substring arguments. -
delete_prefix!: Removes leading prefix; returnsselfif any changes,nilotherwise. -
delete_suffix!: Removes trailing suffix; returnsselfif any changes,nilotherwise. -
lstrip!: Removes leading whitespace; returnsselfif any changes,nilotherwise. -
rstrip!: Removes trailing whitespace; returnsselfif any changes,nilotherwise. -
strip!: Removes leading and trailing whitespace; returnsselfif any changes,nilotherwise. -
chomp!: Removes the trailing record separator, if found; returnsselfif any changes,nilotherwise. -
chop!: Removes trailing newline characters if found; otherwise removes the last character; returnsselfif any changes,nilotherwise.
Converting to New String
Each of these methods returns a new String based on self, often just a modified copy of self.
Extension
-
*: Returns the concatenation of multiple copies ofself. -
+: Returns the concatenation ofselfand a given other string. -
center: Returns a copy ofself, centered by specified padding. -
concat: Returns the concatenation ofselfwith given other strings. -
ljust: Returns a copy ofselfof a given length, right-padded with a given other string. -
rjust: Returns a copy ofselfof a given length, left-padded with a given other string.
Encoding
-
b: Returns a copy ofselfwith ASCII-8BIT encoding. -
scrub: Returns a copy ofselfwith each invalid byte replaced with a given character. -
unicode_normalize: Returns a copy ofselfwith each character Unicode-normalized. -
encode: Returns a copy ofselfwith all characters transcoded from one encoding to another.
Substitution
-
dump: Returns a printable version ofself, enclosed in double-quotes. -
undump: Inverse ofdump; returns a copy ofselfwith changes of the kinds made bydump“undone.” -
sub: Returns a copy ofselfwith the first substring matching a given pattern replaced with a given replacement string. -
gsub: Returns a copy ofselfwith each substring that matches a given pattern replaced with a given replacement string. -
succ(aliased asnext): Returns the string that is the successor toself. -
reverse: Returns a copy ofselfwith its characters in reverse order. -
tr: Returns a copy ofselfwith specified characters replaced with specified replacement characters. -
tr_s: Returns a copy ofselfwith specified characters replaced with specified replacement characters, removing duplicates from the substrings that were modified. -
%: Returns the string resulting from formatting a given object intoself.
Casing
-
capitalize: Returns a copy ofselfwith the first character upcased and all other characters downcased. -
downcase: Returns a copy ofselfwith all characters downcased. -
upcase: Returns a copy ofselfwith all characters upcased. -
swapcase: Returns a copy ofselfwith all upcase characters downcased and all downcase characters upcased.
Deletion
-
delete: Returns a copy ofselfwith characters removed. -
delete_prefix: Returns a copy ofselfwith a given prefix removed. -
delete_suffix: Returns a copy ofselfwith a given suffix removed. -
lstrip: Returns a copy ofselfwith leading whitespace removed. -
rstrip: Returns a copy ofselfwith trailing whitespace removed. -
strip: Returns a copy ofselfwith leading and trailing whitespace removed. -
chomp: Returns a copy ofselfwith a trailing record separator removed, if found. -
chop: Returns a copy ofselfwith trailing newline characters or the last character removed. -
squeeze: Returns a copy ofselfwith contiguous duplicate characters removed. -
[](aliased asslice): Returns a substring determined by a given index, start/length, range, regexp, or string. -
byteslice: Returns a substring determined by a given index, start/length, or range. -
chr: Returns the first character.
Duplication
-
to_s(aliased asto_str): Ifselfis a subclass ofString, returnsselfcopied into aString; otherwise, returnsself.
Converting to Non-String
Each of these methods converts the contents of self to a non-String.
Characters, Bytes, and Clusters
-
bytes: Returns an array of the bytes inself. -
chars: Returns an array of the characters inself. -
codepoints: Returns an array of the integer ordinals inself. -
getbyte: Returns the integer byte at the given index inself. -
grapheme_clusters: Returns an array of the grapheme clusters inself.
Splitting
-
lines: Returns an array of the lines inself, as determined by a given record separator. -
partition: Returns a 3-element array determined by the first substring that matches a given substring or regexp. -
rpartition: Returns a 3-element array determined by the last substring that matches a given substring or regexp. -
split: Returns an array of substrings determined by a given delimiter – regexp or string – or, if a block is given, passes those substrings to the block.
Matching
-
scan: Returns an array of substrings matching a given regexp or string, or, if a block is given, passes each matching substring to the block. -
unpack: Returns an array of substrings extracted fromselfaccording to a given format. -
unpack1: Returns the first substring extracted fromselfaccording to a given format.
Numerics
-
hex: Returns the integer value of the leading characters, interpreted as hexadecimal digits. -
oct: Returns the integer value of the leading characters, interpreted as octal digits. -
ord: Returns the integer ordinal of the first character inself. -
to_c: Returns the complex value of leading characters, interpreted as a complex number. -
to_i: Returns the integer value of leading characters, interpreted as an integer. -
to_f: Returns the floating-point value of leading characters, interpreted as a floating-point number. -
to_r: Returns the rational value of leading characters, interpreted as a rational.
Strings and Symbols
-
inspect: Returns a copy ofself, enclosed in double quotes, with special characters escaped. -
intern(aliased asto_sym): Returns the symbol corresponding toself.
Iterating
-
each_byte: Calls the given block with each successive byte inself. -
each_char: Calls the given block with each successive character inself. -
each_codepoint: Calls the given block with each successive integer codepoint inself. -
each_grapheme_cluster: Calls the given block with each successive grapheme cluster inself. -
each_line: Calls the given block with each successive line inself, as determined by a given record separator. -
upto: Calls the given block with each string value returned by successive calls tosucc.
Class Methods
Raw Strings are JSON Objects (the raw bytes are stored in an array for the key “raw”). The Ruby String can be created by this class method.
Returns a new String object containing the given string.
The options are optional keyword options (see below).
With no argument given and keyword encoding also not given, returns an empty string with the Encoding ASCII-8BIT:
s = String.new s.encoding
With argument string given and keyword option encoding not given, returns a new string with the same encoding as string:
s0 = 'foo'.encode(Encoding::UTF_16) s1 = String.new(s0) s1.encoding
(Unlike String.new, a string literal like '' or a here document literal always has script encoding.)
With keyword option encoding given, returns a string with the specified encoding; the encoding may be an Encoding object, an encoding name, or an encoding name alias:
String.new(encoding: Encoding::US_ASCII).encoding String.new('', encoding: Encoding::US_ASCII).encoding String.new('foo', encoding: Encoding::US_ASCII).encoding String.new('foo', encoding: 'US-ASCII').encoding String.new('foo', encoding: 'ASCII').encoding
The given encoding need not be valid for the string’s content, and its validity is not checked:
s = String.new('こんにちは', encoding: 'ascii') s.valid_encoding?
But the given encoding itself is checked:
String.new('foo', encoding: 'bar')
With keyword option capacity given, the given value is advisory only, and may or may not set the size of the internal buffer, which may in turn affect performance:
String.new('foo', capacity: 1) String.new('foo', capacity: 4096)
Attempts to convert the given object to a string.
If object is already a string, returns object, unmodified.
Otherwise if object responds to :to_str, calls object.to_str and returns the result.
Returns nil if object does not respond to :to_str.
Raises an exception unless object.to_str returns a string.
Instance Methods
Appends a string representation of object to self; returns self.
If object is a string, appends it to self:
s = 'foo' s << 'bar' s
If object is an integer, its value is considered a codepoint; converts the value to a character before concatenating:
s = 'foo' s << 33
Additionally, if the codepoint is in range 0..0xff and the encoding of self is Encoding::US_ASCII, changes the encoding to Encoding::ASCII_8BIT:
s = 'foo'.encode(Encoding::US_ASCII) s.encoding s << 0xff s.encoding
Raises RangeError if that codepoint is not representable in the encoding of self:
s = 'foo' s.encoding s << 0x00110000 s = 'foo'.encode(Encoding::EUC_JP) s << 0x00800080
Related: see Modifying.
Compares self and other, evaluating their contents, not their lengths.
Returns:
-
-1, ifselfis smaller. -
0, if the two are equal. -
1, ifselfis larger. -
nil, if the two are incomparable.
Examples:
'a' <=> 'b' 'a' <=> 'ab' 'a' <=> 'a' 'b' <=> 'a' 'ab' <=> 'a' 'a' <=> :a
Class String includes module Comparable, each of whose methods uses String#<=> for comparison.
Related: see Comparing.
When object is a Regexp, returns the index of the first substring in self matched by object, or nil if no match is found; updates Regexp-related global variables:
'foo' =~ /f/ $~ 'foo' =~ /o/ $~ 'foo' =~ /x/ $~
Note that string =~ regexp is different from regexp =~ string (see Regexp#=~):
number = nil 'no. 9' =~ /(?<number>\d+)/ number /(?<number>\d+)/ =~ 'no. 9' number
If object is not a Regexp, returns the value returned by object =~ self.
Related: see Querying.
Returns whether object is equal to self.
When object is a string, returns whether object has the same length and content as self:
s = 'foo' s == 'foo' s == 'food' s == 'FOO'
Returns false if the two strings’ encodings are not compatible:
"\u{e4 f6 fc}".encode(Encoding::ISO_8859_1) == ("\u{c4 d6 dc}")
When object is not a string:
-
If
objectresponds to methodto_str,object == selfis called and its return value is returned. -
If
objectdoes not respond toto_str,falseis returned.
Related: Comparing.
Returns a frozen string equal to self.
The returned string is self if and only if all of the following are true:
-
selfis already frozen. -
selfis an instance of String (rather than of a subclass of String) -
selfhas no instance variables set on it.
Otherwise, the returned string is a frozen copy of self.
Returning self, when possible, saves duplicating self; see Data deduplication.
It may also save duplicating other, already-existing, strings:
s0 = 'foo' s1 = 'foo' s0.object_id == s1.object_id (-s0).object_id == (-s1).object_id
Note that method -@ is convenient for defining a constant:
FileName = -'config/database.yml'
While its alias dedup is better suited for chaining:
'foo'.dedup.gsub!('o')
Related: see Freezing/Unfreezing.
Returns the substring of self specified by the arguments.
Form self[index]
With non-negative integer argument index given, returns the 1-character substring found in self at character offset index:
'hello'[0] 'hello'[4] 'hello'[5] 'Привет'[2] 'こんにちは'[4]
With negative integer argument index given, counts backward from the end of self:
'hello'[-1] 'hello'[-5] 'hello'[-6]
Form self[start, length]
With integer arguments start and length given, returns a substring of size length characters (as available) beginning at character offset specified by start.
If argument start is non-negative, the offset is start:
'hello'[0, 1] 'hello'[0, 5] 'hello'[0, 6] 'hello'[2, 3] 'hello'[2, 0] 'hello'[2, -1]
If argument start is negative, counts backward from the end of self:
'hello'[-1, 1] 'hello'[-5, 5] 'hello'[-1, 0] 'hello'[-6, 5]
Special case: if start equals the length of self, returns a new empty string:
'hello'[5, 3]
Form self[range]
With Range argument range given, forms substring self[range.start, range.size]:
'hello'[0..2] 'hello'[0, 3] 'hello'[0...2] 'hello'[0, 2] 'hello'[0, 0] 'hello'[0...0]
Form self[regexp, capture = 0]
With Regexp argument regexp given and capture as zero, searches for a matching substring in self; updates Regexp-related global variables:
'hello'[/ell/] 'hello'[/l+/] 'hello'[//] 'hello'[/nosuch/]
With capture as a positive integer n, returns the +n+th matched group:
'hello'[/(h)(e)(l+)(o)/] 'hello'[/(h)(e)(l+)(o)/, 1] $1 'hello'[/(h)(e)(l+)(o)/, 2] $2 'hello'[/(h)(e)(l+)(o)/, 3] 'hello'[/(h)(e)(l+)(o)/, 4] 'hello'[/(h)(e)(l+)(o)/, 5]
Form self[substring]
With string argument substring given, returns the matching substring of self, if found:
'hello'['ell'] 'hello'[''] 'hello'['nosuch'] 'Привет'['ив'] 'こんにちは'['んにち']
Related: see Converting to New String.
Returns self with all, a substring, or none of its contents replaced; returns the argument other_string.
Form self[index] = other_string
With non-negative integer argument index given, searches for the 1-character substring found in self at character offset index:
s = 'hello' s[0] = 'foo' s s = 'hello' s[4] = 'foo' s s = 'hello' s[5] = 'foo' s s = 'hello' s[6] = 'foo'
With negative integer argument index given, counts backward from the end of self:
s = 'hello' s[-1] = 'foo' s s = 'hello' s[-5] = 'foo' s s = 'hello' s[-6] = 'foo'
Form self[start, length] = other_string
With integer arguments start and length given, searches for a substring of size length characters (as available) beginning at character offset specified by start.
If argument start is non-negative, the offset is start:
s = 'hello' s[0, 1] = 'foo' s s = 'hello' s[0, 5] = 'foo' s s = 'hello' s[0, 9] = 'foo' s s = 'hello' s[2, 0] = 'foo' s s = 'hello' s[2, -1] = 'foo'
If argument start is negative, counts backward from the end of self:
s = 'hello' s[-1, 1] = 'foo' s s = 'hello' s[-1, 9] = 'foo' s s = 'hello' s[-5, 2] = 'foo' s s = 'hello' s[-3, 0] = 'foo' s s = 'hello' s[-6, 2] = 'foo'
Special case: if start equals the length of self, the argument is appended to self:
s = 'hello' s[5, 3] = 'foo' s
Form self[range] = other_string
With Range argument range given, equivalent to self[range.start, range.size] = other_string:
s0 = 'hello' s1 = 'hello' s0[0..2] = 'foo' s1[0, 3] = 'foo' s0 s1 s = 'hello' s[0...2] = 'foo' s s = 'hello' s[0...0] = 'foo' s s = 'hello' s[9..10] = 'foo'
Form self[regexp, capture = 0] = other_string
With Regexp argument regexp given and capture as zero, searches for a matching substring in self; updates Regexp-related global variables:
s = 'hello' s[/l/] = 'L' [$`, $&, $'] s[/eLlo/] = 'owdy' [$`, $&, $'] s[/eLlo/] = 'owdy' [$`, $&, $']
With capture as a positive integer n, searches for the +n+th matched group:
s = 'hello' s[/(h)(e)(l+)(o)/] = 'foo' # => "foo" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' s[/(h)(e)(l+)(o)/, 1] = 'foo' # => "foo" s # => "fooello" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' s[/(h)(e)(l+)(o)/, 2] = 'foo' # => "foo" s # => "hfoollo" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' s[/(h)(e)(l+)(o)/, 4] = 'foo' # => "foo" s # => "hellfoo" [$`, $&, $'] # => ["", "hello", ""] s = 'hello' # => "hello" s[/(h)(e)(l+)(o)/, 5] = 'foo # Raises IndexError: index 5 out of regexp. s = 'hello' s[/nosuch/] = 'foo' # Raises IndexError: regexp not matched.
Form self[substring] = other_string
With string argument substring given:
s = 'hello' s['l'] = 'foo' s s = 'hello' s['ll'] = 'foo' s s = 'Привет' s['ив'] = 'foo' s s = 'こんにちは' s['んにち'] = 'foo' s s['nosuch'] = 'foo'
Related: see Modifying.
Returns the result of formatting object into the format specifications contained in self (see Format Specifications):
'%05d' % 123
If self contains multiple format specifications, object must be an array or hash containing the objects to be formatted:
'%-5s: %016x' % [ 'ID', self.object_id ] 'foo = %{foo}' % {foo: 'bar'} 'foo = %{foo}, baz = %{baz}' % {foo: 'bar', baz: 'bat'}
Related: see Converting to New String.
Returns a new string containing other_string concatenated to self:
'Hello from ' + self.to_s
Related: see Converting to New String.
Returns self if self is not frozen and can be mutated without warning issuance.
Otherwise returns self.dup, which is not frozen.
Related: see Freezing/Unfreezing.
Concatenates each object in objects into self; returns self; performs no encoding validation or conversion:
s = 'foo' s.append_as_bytes(" \xE2\x82") s.valid_encoding? s.append_as_bytes("\xAC 12") s.valid_encoding?
When a given object is an integer, the value is considered an 8-bit byte; if the integer occupies more than one byte (i.e,. is greater than 255), appends only the low-order byte (similar to String#setbyte):
s = "" s.append_as_bytes(0, 257) s.bytesize
Related: see Modifying.
Returns whether self contains only ASCII characters:
'abc'.ascii_only? "abc\u{6666}".ascii_only?
Related: see Querying.
Returns a copy of self that has ASCII-8BIT encoding; the underlying bytes are not modified:
s = "\x99" s.encoding t = s.b t.encoding s = "\u4095" s.encoding s.bytes t = s.b t.encoding t.bytes
Related: see Converting to New String.
Returns the 0-based integer index of a substring of self specified by object (a string or Regexp) and offset, or nil if there is no such substring; the returned index is the count of bytes (not characters).
When object is a string, returns the index of the first found substring equal to object:
s = 'foo' s.size s.bytesize s.byteindex('f') s.byteindex('o') s.byteindex('oo') s.byteindex('ooo')
When object is a Regexp, returns the index of the first found substring matching object; updates Regexp-related global variables:
s = 'foo' s.byteindex(/f/) $~ s.byteindex(/o/) s.byteindex(/oo/) s.byteindex(/ooo/) $~
Integer argument offset, if given, specifies the 0-based index of the byte where searching is to begin.
When offset is non-negative, searching begins at byte position offset:
s = 'foo' s.byteindex('o', 1) s.byteindex('o', 2) s.byteindex('o', 3)
When offset is negative, counts backward from the end of self:
s = 'foo' s.byteindex('o', -1) s.byteindex('o', -2) s.byteindex('o', -3) s.byteindex('o', -4)
Raises IndexError if the byte at offset is not the first byte of a character:
s = "\uFFFF\uFFFF" s.size s.bytesize s.byteindex("\uFFFF") s.byteindex("\uFFFF", 1) s.byteindex("\uFFFF", 2) s.byteindex("\uFFFF", 3) s.byteindex("\uFFFF", 4) s.byteindex("\uFFFF", 5) s.byteindex("\uFFFF", 6)
Related: see Querying.
Returns the 0-based integer index of a substring of self that is the last match for the given object (a string or Regexp) and offset, or nil if there is no such substring; the returned index is the count of bytes (not characters).
When object is a string, returns the index of the last found substring equal to object:
s = 'foo' s.size s.bytesize s.byterindex('f') s.byterindex('o') s.byterindex('oo') s.byterindex('ooo')
When object is a Regexp, returns the index of the last found substring matching object; updates Regexp-related global variables:
s = 'foo' s.byterindex(/f/) $~ s.byterindex(/o/) s.byterindex(/oo/) s.byterindex(/ooo/) $~
The last match means starting at the possible last position, not the last of the longest matches:
s = 'foo' s.byterindex(/o+/) $~
To get the last longest match, use a negative lookbehind:
s = 'foo' s.byterindex(/(?<!o)o+/) $~
Or use method byteindex with negative lookahead:
s = 'foo' s.byteindex(/o+(?!.*o)/) $~
Integer argument offset, if given, specifies the 0-based index of the byte where searching is to end.
When offset is non-negative, searching ends at byte position offset:
s = 'foo' s.byterindex('o', 0) s.byterindex('o', 1) s.byterindex('o', 2) s.byterindex('o', 3)
When offset is negative, counts backward from the end of self:
s = 'foo' s.byterindex('o', -1) s.byterindex('o', -2) s.byterindex('o', -3)
Raises IndexError if the byte at offset is not the first byte of a character:
s = "\uFFFF\uFFFF" s.size s.bytesize s.byterindex("\uFFFF") s.byterindex("\uFFFF", 1) s.byterindex("\uFFFF", 2) s.byterindex("\uFFFF", 3) s.byterindex("\uFFFF", 4) s.byterindex("\uFFFF", 5) s.byterindex("\uFFFF", 6)
Related: see Querying.
Returns an array of the bytes in self:
'hello'.bytes 'Привет'.bytes 'こんにちは'.bytes
Related: see Converting to Non-String.
Returns the count of bytes in self.
Note that the byte count may be different from the character count (returned by size):
s = 'foo' s.bytesize s.size s = 'Привет' s.bytesize s.size s = 'こんにちは' s.bytesize s.size
Related: see Querying.
Returns a substring of self, or nil if the substring cannot be constructed.
With integer arguments offset and length given, returns the substring beginning at the given offset and of the given length (as available):
s = '0123456789' s.byteslice(2) s.byteslice(200) s.byteslice(4, 3) s.byteslice(4, 30)
Returns nil if length is negative or offset falls outside of self:
s.byteslice(4, -1) s.byteslice(40, 2)
Counts backwards from the end of self if offset is negative:
s = '0123456789' s.byteslice(-4) s.byteslice(-4, 3)
With Range argument range given, returns byteslice(range.begin, range.size):
s = '0123456789' s.byteslice(4..6) s.byteslice(-6..-4) s.byteslice(5..2) s.byteslice(40..42)
The starting and ending offsets need not be on character boundaries:
s = 'こんにちは' s.byteslice(0, 3) s.byteslice(1, 3)
The encodings of self and the returned substring are always the same:
s.encoding s.byteslice(0, 3).encoding s.byteslice(1, 3).encoding
But, depending on the character boundaries, the encoding of the returned substring may not be valid:
s.valid_encoding? s.byteslice(0, 3).valid_encoding? s.byteslice(1, 3).valid_encoding?
Related: see Converting to New String.
Replaces target bytes in self with source bytes from the given string str; returns self.
In the first form, arguments offset and length determine the target bytes, and the source bytes are all of the given str:
'0123456789'.bytesplice(0, 3, 'abc') '0123456789'.bytesplice(3, 3, 'abc') '0123456789'.bytesplice(0, 50, 'abc') '0123456789'.bytesplice(50, 3, 'abc')
The counts of the target bytes and source source bytes may be different:
'0123456789'.bytesplice(0, 6, 'abc') '0123456789'.bytesplice(0, 1, 'abc')
And either count may be zero (i.e., specifying an empty string):
'0123456789'.bytesplice(0, 3, '') '0123456789'.bytesplice(0, 0, 'abc')
In the second form, just as in the first, arugments offset and length determine the target bytes; argument str contains the source bytes, and the additional arguments str_offset and str_length determine the actual source bytes:
'0123456789'.bytesplice(0, 3, 'abc', 0, 3) '0123456789'.bytesplice(0, 3, 'abc', 1, 1) '0123456789'.bytesplice(0, 1, 'abc', 0, 3) '0123456789'.bytesplice(0, 3, 'abc', 1, 0) '0123456789'.bytesplice(0, 0, 'abc', 0, 3)
In the third form, argument range determines the target bytes and the source bytes are all of the given str:
'0123456789'.bytesplice(0..2, 'abc') '0123456789'.bytesplice(3..5, 'abc') '0123456789'.bytesplice(0..5, 'abc') '0123456789'.bytesplice(0..0, 'abc') '0123456789'.bytesplice(0..2, '') '0123456789'.bytesplice(0...0, 'abc')
In the fourth form, just as in the third, arugment range determines the target bytes; argument str contains the source bytes, and the additional argument str_range determines the actual source bytes:
'0123456789'.bytesplice(0..2, 'abc', 0..2) '0123456789'.bytesplice(3..5, 'abc', 0..2) '0123456789'.bytesplice(0..2, 'abc', 0..1) '0123456789'.bytesplice(0..1, 'abc', 0..2) '0123456789'.bytesplice(0..2, 'abc', 0...0) '0123456789'.bytesplice(0...0, 'abc', 0..2)
In any of the forms, the beginnings and endings of both source and target must be on character boundaries.
In these examples, self has five 3-byte characters, and so has character boundaries at offsets 0, 3, 6, 9, 12, and 15.
'こんにちは'.bytesplice(0, 3, 'abc') 'こんにちは'.bytesplice(1, 3, 'abc') 'こんにちは'.bytesplice(0, 2, 'abc')
Returns a string containing the characters in self, each with possibly changed case:
-
The first character made uppercase.
-
All other characters are made lowercase.
Examples:
'hello'.capitalize 'HELLO'.capitalize 'straße'.capitalize 'STRAẞE'.capitalize 'привет'.capitalize 'ПРИВЕТ'.capitalize
Some characters (and some character sets) do not have upcase and downcase versions; see Case Mapping:
s = '1, 2, 3, ...' s.capitalize == s s = 'こんにちは' s.capitalize == s
The casing is affected by the given mapping, which may be :ascii, :fold, or :turkic; see Case Mappings.
Related: see Converting to New String.
Like String#capitalize, except that:
-
Changes character casings in
self(not in a copy ofself). -
Returns
selfif any changes are made,nilotherwise.
Related: See Modifying.
Ignoring case, compares self and other_string; returns:
-
-1 if
self.downcaseis smaller thanother_string.downcase. -
0 if the two are equal.
-
1 if
self.downcaseis larger thanother_string.downcase. -
nilif the two are incomparable.
See Case Mapping.
Examples:
'foo'.casecmp('goo') 'goo'.casecmp('foo') 'foo'.casecmp('food') 'food'.casecmp('foo') 'FOO'.casecmp('foo') 'foo'.casecmp('FOO') 'foo'.casecmp(1)
Related: see Comparing.
Returns true if self and other_string are equal after Unicode case folding, false if unequal, nil if incomparable.
See Case Mapping.
Examples:
'foo'.casecmp?('goo') 'goo'.casecmp?('foo') 'foo'.casecmp?('food') 'food'.casecmp?('foo') 'FOO'.casecmp?('foo') 'foo'.casecmp?('FOO') 'foo'.casecmp?(1)
Related: see Comparing.
Returns a centered copy of self.
If integer argument size is greater than the size (in characters) of self, returns a new string of length size that is a copy of self, centered and padded on one or both ends with pad_string:
'hello'.center(6) 'hello'.center(10) 'hello'.center(20, '-|') 'hello'.center(10, 'abcdefg') ' hello '.center(13) 'Привет'.center(10) 'こんにちは'.center(10)
If size is less than or equal to the size of self, returns an unpadded copy of self:
'hello'.center(5) 'hello'.center(-10)
Related: see Converting to New String.
Returns an array of the characters in self:
'hello'.chars 'Привет'.chars 'こんにちは'.chars ''.chars
Related: see Converting to Non-String.
Returns a new string copied from self, with trailing characters possibly removed:
When line_sep is "\n", removes the last one or two characters if they are "\r", "\n", or "\r\n" (but not "\n\r"):
$/ "abc\r".chomp "abc\n".chomp "abc\r\n".chomp "abc\n\r".chomp "тест\r\n".chomp "こんにちは\r\n".chomp
When line_sep is '' (an empty string), removes multiple trailing occurrences of "\n" or "\r\n" (but not "\r" or "\n\r"):
"abc\n\n\n".chomp('') "abc\r\n\r\n\r\n".chomp('') "abc\n\n\r\n\r\n\n\n".chomp('') "abc\n\r\n\r\n\r".chomp('') "abc\r\r\r".chomp('')
When line_sep is neither "\n" nor '', removes a single trailing line separator if there is one:
'abcd'.chomp('cd') 'abcdcd'.chomp('cd') 'abcd'.chomp('xx')
Related: see Converting to New String.
Like String#chomp, except that:
-
Removes trailing characters from
self(not from a copy ofself). -
Returns
selfif any characters are removed,nilotherwise.
Related: see Modifying.
Returns a new string copied from self, with trailing characters possibly removed.
Removes "\r\n" if those are the last two characters.
"abc\r\n".chop "тест\r\n".chop "こんにちは\r\n".chop
Otherwise removes the last character if it exists.
'abcd'.chop 'тест'.chop 'こんにちは'.chop ''.chop
If you only need to remove the newline separator at the end of the string, String#chomp is a better alternative.
Related: see Converting to New String.
Like String#chop, except that:
-
Removes trailing characters from
self(not from a copy ofself). -
Returns
selfif any characters are removed,nilotherwise.
Related: see Modifying.
Returns a string containing the first character of self:
'hello'.chr 'тест'.chr 'こんにちは'.chr ''.chr
Related: see Converting to New String.
Returns an array of the codepoints in self; each codepoint is the integer value for a character:
'hello'.codepoints 'тест'.codepoints 'こんにちは'.codepoints ''.codepoints
Related: see Converting to Non-String.
Concatenates each object in objects to self; returns self:
'foo'.concat('bar', 'baz')
For each given object object that is an integer, the value is considered a codepoint and converted to a character before concatenation:
'foo'.concat(32, 'bar', 32, 'baz') 'те'.concat(1089, 1090) 'こん'.concat(12395, 12385, 12399)
Related: see Converting to New String.
Returns the total number of characters in self that are specified by the given selectors.
For one 1-character selector, returns the count of instances of that character:
s = 'abracadabra' s.count('a') s.count('b') s.count('x') s.count('') s = 'тест' s.count('т') s.count('е') s = 'よろしくお願いします' s.count('よ') s.count('し')
For one multi-character selector, returns the count of instances for all specified characters:
s = 'abracadabra' s.count('ab') s.count('abc') s.count('abcd') s.count('abcdr') s.count('abcdrx')
Order and repetition do not matter:
s.count('ba') == s.count('ab') s.count('baab') == s.count('ab')
For multiple selectors, forms a single selector that is the intersection of characters in all selectors and returns the count of instances for that selector:
s = 'abcdefg' s.count('abcde', 'dcbfg') == s.count('bcd') s.count('abc', 'def') == s.count('')
In a character selector, three characters get special treatment:
-
A caret (
'^') functions as a negation operator for the immediately following characters:s = 'abracadabra' s.count('^bc')
-
A hyphen (
'-') between two other characters defines a range of characters:s = 'abracadabra' s.count('a-c')
-
A backslash (
'\') acts as an escape for a caret, a hyphen, or another backslash:s = 'abracadabra' s.count('\^bc') s.count('a\-c') 'foo\bar\baz'.count('\\')
These usages may be mixed:
s = 'abracadabra' s.count('a-cq-t') s.count('ac-d') s.count('^a-c')
For multiple selectors, all forms may be used, including negations, ranges, and escapes.
s = 'abracadabra' s.count('^abc', '^def') == s.count('^abcdef') s.count('a-e', 'c-g') == s.count('cde') s.count('^abc', 'c-g') == s.count('defg')
Related: see Querying.
Returns the string generated by calling crypt(3) standard library function with str and salt_str, in this order, as its arguments. Please do not use this method any longer. It is legacy; provided only for backward compatibility with ruby scripts in earlier days. It is bad to use in contemporary programs for several reasons:
-
Behaviour of C’s
crypt(3)depends on the OS it is run. The generated string lacks data portability. -
On some OSes such as Mac OS,
crypt(3)never fails (i.e. silently ends up in unexpected results). -
On some OSes such as Mac OS,
crypt(3)is not thread safe. -
So-called “traditional” usage of
crypt(3)is very very very weak. According to its manpage, Linux’s traditionalcrypt(3)output has only 2**56 variations; too easy to brute force today. And this is the default behaviour. -
In order to make things robust some OSes implement so-called “modular” usage. To go through, you have to do a complex build-up of the
salt_strparameter, by hand. Failure in generation of a proper salt string tends not to yield any errors; typos in parameters are normally not detectable.-
For instance, in the following example, the second invocation of
String#cryptis wrong; it has a typo in “round=” (lacks “s”). However the call does not fail and something unexpected is generated."foo".crypt("$5$rounds=1000$salt$") "foo".crypt("$5$round=1000$salt$")
-
-
Even in the “modular” mode, some hash functions are considered archaic and no longer recommended at all; for instance module
$1$is officially abandoned by its author: see phk.freebsd.dk/sagas/md5crypt_eol/ . For another instance module$3$is considered completely broken: see the manpage of FreeBSD. -
On some OS such as Mac OS, there is no modular mode. Yet, as written above,
crypt(3)on Mac OS never fails. This means even if you build up a proper salt string it generates a traditional DES hash anyways, and there is no way for you to be aware of."foo".crypt("$5$rounds=1000$salt$")
If for some reason you cannot migrate to other secure contemporary password hashing algorithms, install the string-crypt gem and require 'string/crypt' to continue using it.
Returns a new string that is a copy of self with certain characters removed; the removed characters are all instances of those specified by the given string selectors.
For one 1-character selector, removes all instances of that character:
s = 'abracadabra' s.delete('a') s.delete('b') s.delete('x') s.delete('') s = 'тест' s.delete('т') s.delete('е') s = 'よろしくお願いします' s.delete('よ') s.delete('し')
For one multi-character selector, removes all instances of the specified characters:
s = 'abracadabra' s.delete('ab') s.delete('abc') s.delete('abcd') s.delete('abcdr') s.delete('abcdrx')
Order and repetition do not matter:
s.delete('ba') == s.delete('ab') s.delete('baab') == s.delete('ab')
For multiple selectors, forms a single selector that is the intersection of characters in all selectors and removes all instances of characters specified by that selector:
s = 'abcdefg' s.delete('abcde', 'dcbfg') == s.delete('bcd') s.delete('abc', 'def') == s.delete('')
In a character selector, three characters get special treatment:
-
A caret (
'^') functions as a negation operator for the immediately following characters:s = 'abracadabra' s.delete('^bc')
-
A hyphen (
'-') between two other characters defines a range of characters:s = 'abracadabra' s.delete('a-c')
-
A backslash (
'\') acts as an escape for a caret, a hyphen, or another backslash:s = 'abracadabra' s.delete('\^bc') s.delete('a\-c') 'foo\bar\baz'.delete('\\')
These usages may be mixed:
s = 'abracadabra' s.delete('a-cq-t') s.delete('ac-d') s.delete('^a-c')
For multiple selectors, all forms may be used, including negations, ranges, and escapes.
s = 'abracadabra' s.delete('^abc', '^def') == s.delete('^abcdef') s.delete('a-e', 'c-g') == s.delete('cde') s.delete('^abc', 'c-g') == s.delete('defg')
Related: see Converting to New String.
Like String#delete, but modifies self in place; returns self if any characters were deleted, nil otherwise.
Related: see Modifying.
Returns a copy of self with leading substring prefix removed:
'oof'.delete_prefix('o') 'oof'.delete_prefix('oo') 'oof'.delete_prefix('oof') 'oof'.delete_prefix('x') 'тест'.delete_prefix('те') 'こんにちは'.delete_prefix('こん')
Related: see Converting to New String.
Returns a copy of self with trailing substring suffix removed:
'foo'.delete_suffix('o') 'foo'.delete_suffix('oo') 'foo'.delete_suffix('foo') 'foo'.delete_suffix('f') 'foo'.delete_suffix('x') 'тест'.delete_suffix('ст') 'こんにちは'.delete_suffix('ちは')
Related: see Converting to New String.
Returns a new string containing the downcased characters in self:
'HELLO'.downcase 'STRAẞE'.downcase 'ПРИВЕТ'.downcase 'RubyGems.org'.downcase
Some characters (and some character sets) do not have upcase and downcase versions; see Case Mapping:
s = '1, 2, 3, ...' s.downcase == s s = 'こんにちは' s.downcase == s
The casing is affected by the given mapping, which may be :ascii, :fold, or :turkic; see Case Mappings.
Related: see Converting to New String.
Like String#downcase, except that:
-
Changes character casings in
self(not in a copy ofself). -
Returns
selfif any changes are made,nilotherwise.
Related: See Modifying.
For an ordinary string, this method, +String#dump+, returns a printable ASCII-only version of self, enclosed in double-quotes.
For a dumped string, method String#undump is the inverse of +String#dump+; it returns a “restored” version of self, where all the dumping changes have been undone.
In the simplest case, the dumped string contains the original string, enclosed in double-quotes; this example is done in irb (interactive Ruby), which uses method inspect to render the results:
s = 'hello' s.dump s.dump.undump
Keep in mind that in the second line above:
-
The outer double-quotes are put on by
inspect, and are not part of the output ofdump. -
The inner double-quotes are part of the output of
dump, and are escaped byinspectbecause they are within the outer double-quotes.
To avoid confusion, we’ll use this helper method to omit the outer double-quotes:
def dump(s) print "String: ", s, "\n" print "Dumped: ", s.dump, "\n" print "Undumped: ", s.dump.undump, "\n" end
So that for string 'hello', we’ll see:
String: hello Dumped: "hello" Undumped: hello
In a dump, certain special characters are escaped:
String: " Dumped: "\"" Undumped: " String: \ Dumped: "\\" Undumped: \
In a dump, unprintable characters are replaced by printable ones; the unprintable characters are the whitespace characters (other than space itself); here we see the ordinals for those characers, together with explanatory text:
h = { 7 => 'Alert (BEL)', 8 => 'Backspace (BS)', 9 => 'Horizontal tab (HT)', 10 => 'Linefeed (LF)', 11 => 'Vertical tab (VT)', 12 => 'Formfeed (FF)', 13 => 'Carriage return (CR)' }
In this example, the dumped output is printed by method inspect, and so contains both outer double-quotes and escaped inner double-quotes:
s = '' h.keys.each {|i| s << i } s s.dump
If self is encoded in UTF-8 and contains Unicode characters, each Unicode character is dumped as a Unicode escape sequence:
String: тест Dumped: "\u0442\u0435\u0441\u0442" Undumped: тест String: こんにちは Dumped: "\u3053\u3093\u306B\u3061\u306F" Undumped: こんにちは
If the encoding of self is not ASCII-compatible (i.e., if self.encoding.ascii_compatible? returns false), each ASCII-compatible byte is dumped as an ASCII character, and all other bytes are dumped as hexadecimal; also appends .dup.force_encoding(\"encoding\"), where <encoding> is self.encoding.name:
String: hello
Dumped: "\xFE\xFF\x00h\x00e\x00l\x00l\x00o".dup.force_encoding("UTF-16")
Undumped: hello
String: тест
Dumped: "\xFE\xFF\x04B\x045\x04A\x04B".dup.force_encoding("UTF-16")
Undumped: тест
String: こんにちは
Dumped: "\xFE\xFF0S0\x930k0a0o".dup.force_encoding("UTF-16")
Undumped: こんにちは
With a block given, calls the block with each successive byte from self; returns self:
a = [] 'hello'.each_byte {|byte| a.push(byte) } a a = [] 'тест'.each_byte {|byte| a.push(byte) } a a = [] 'こんにちは'.each_byte {|byte| a.push(byte) } a
With no block given, returns an enumerator.
Related: see Iterating.
With a block given, calls the block with each successive character from self; returns self:
a = [] 'hello'.each_char do |char| a.push(char) end a a = [] 'тест'.each_char do |char| a.push(char) end a a = [] 'こんにちは'.each_char do |char| a.push(char) end a
With no block given, returns an enumerator.
Related: see Iterating.
With a block given, calls the block with each successive codepoint from self; each codepoint is the integer value for a character; returns self:
a = [] 'hello'.each_codepoint do |codepoint| a.push(codepoint) end a a = [] 'тест'.each_codepoint do |codepoint| a.push(codepoint) end a a = [] 'こんにちは'.each_codepoint do |codepoint| a.push(codepoint) end a
With no block given, returns an enumerator.
Related: see Iterating.
With a block given, calls the given block with each successive grapheme cluster from self (see Unicode Grapheme Cluster Boundaries); returns self:
a = [] 'hello'.each_grapheme_cluster do |grapheme_cluster| a.push(grapheme_cluster) end a a = [] 'тест'.each_grapheme_cluster do |grapheme_cluster| a.push(grapheme_cluster) end a a = [] 'こんにちは'.each_grapheme_cluster do |grapheme_cluster| a.push(grapheme_cluster) end a
With no block given, returns an enumerator.
Related: see Iterating.
With a block given, forms the substrings (lines) that are the result of splitting self at each occurrence of the given record_separator; passes each line to the block; returns self.
With the default record_separator:
$/ s = <<~EOT This is the first line. This is line two. This is line four. This is line five. EOT s.each_line {|line| p line }
Output:
"This is the first line.\n" "This is line two.\n" "\n" "This is line four.\n" "This is line five.\n"
With a different record_separator:
record_separator = ' is ' s.each_line(record_separator) {|line| p line }
Output:
"This is " "the first line.\nThis is " "line two.\n\nThis is " "line four.\nThis is " "line five.\n"
With chomp as true, removes the trailing record_separator from each line:
s.each_line(chomp: true) {|line| p line }
Output:
"This is the first line." "This is line two." "" "This is line four." "This is line five."
With an empty string as record_separator, forms and passes “paragraphs” by splitting at each occurrence of two or more newlines:
record_separator = '' s.each_line(record_separator) {|line| p line }
Output:
"This is the first line.\nThis is line two.\n\n" "This is line four.\nThis is line five.\n"
With no block given, returns an enumerator.
Related: see Iterating.
Returns whether the length of self is zero:
'hello'.empty? ' '.empty? ''.empty?
Related: see Querying.
Returns a copy of self transcoded as determined by dst_encoding; see Encodings.
By default, raises an exception if self contains an invalid byte or a character not defined in dst_encoding; that behavior may be modified by encoding options; see below.
With no arguments:
-
Uses the same encoding if
Encoding.default_internalisnil(the default):Encoding.default_internal s = "Ruby\x99".force_encoding('Windows-1252') s.encoding s.bytes t = s.encode t.encoding t.bytes
-
Otherwise, uses the encoding
Encoding.default_internal:Encoding.default_internal = 'UTF-8' t = s.encode t.encoding
With only argument dst_encoding given, uses that encoding:
s = "Ruby\x99".force_encoding('Windows-1252') s.encoding t = s.encode('UTF-8') t.encoding
With arguments dst_encoding and src_encoding given, interprets self using src_encoding, encodes the new string using dst_encoding:
s = "Ruby\x99" t = s.encode('UTF-8', 'Windows-1252') t.encoding
Optional keyword arguments enc_opts specify encoding options; see Encoding Options.
Please note that, unless invalid: :replace option is given, conversion from an encoding enc to the same encoding enc (independent of whether enc is given explicitly or implicitly) is a no-op, i.e. the string is simply copied without any changes, and no exceptions are raised, even if there are invalid bytes.
Related: see Converting to New String.
Returns whether self ends with any of the given strings:
'foo'.end_with?('oo') 'foo'.end_with?('bar', 'oo') 'foo'.end_with?('bar', 'baz') 'foo'.end_with?('') 'тест'.end_with?('т') 'こんにちは'.end_with?('は')
Related: see Querying.
Returns whether self and object have the same length and content:
s = 'foo' s.eql?('foo') s.eql?('food') s.eql?('FOO')
Returns false if the two strings’ encodings are not compatible:
s0 = "äöü" s1 = s0.encode(Encoding::ISO_8859_1) s0.encoding s1.encoding s0.eql?(s1)
See Encodings.
Related: see Querying.
Changes the encoding of self to the given encoding, which may be a string encoding name or an Encoding object; does not change the underlying bytes; returns self:
s = 'łał' s.bytes s.encoding s.force_encoding('ascii') s.encoding s.valid_encoding? s.bytes
Makes the change even if the given encoding is invalid for self (as is the change above):
s.valid_encoding?
See Encodings.
Related: see Modifying.
Returns the byte at zero-based index as an integer:
s = 'foo' s.getbyte(0) s.getbyte(1) s.getbyte(2)
Counts backward from the end if index is negative:
s.getbyte(-3)
Returns nil if index is out of range:
s.getbyte(3) s.getbyte(-4)
More examples:
s = 'тест' s.bytes s.getbyte(2) s = 'こんにちは' s.bytes s.getbyte(2)
Related: see Converting to Non-String.
Returns an array of the grapheme clusters in self (see Unicode Grapheme Cluster Boundaries):
s = "ä-pqr-b̈-xyz-c̈" s.size s.bytesize s.grapheme_clusters.size s.grapheme_clusters
Details:
s = "ä" s.grapheme_clusters s.bytes s.chars s.chars.map {|char| char.ord }
Related: see Converting to Non-String.
Returns a copy of self with zero or more substrings replaced.
Argument pattern may be a string or a Regexp; argument replacement may be a string or a Hash. Varying types for the argument values makes this method very versatile.
Below are some simple examples; for many more examples, see Substitution Methods.
With arguments pattern and string replacement given, replaces each matching substring with the given replacement string:
s = 'abracadabra' s.gsub('ab', 'AB') s.gsub(/[a-c]/, 'X')
With arguments pattern and hash replacement given, replaces each matching substring with a value from the given replacement hash, or removes it:
h = {'a' => 'A', 'b' => 'B', 'c' => 'C'} s.gsub(/[a-c]/, h) s.gsub(/[a-d]/, h)
With argument pattern and a block given, calls the block with each matching substring; replaces that substring with the block’s return value:
s.gsub(/[a-d]/) {|substring| substring.upcase }
With argument pattern and no block given, returns a new Enumerator.
Related: see Converting to New String.
Like String#gsub, except that:
-
Performs substitutions in
self(not in a copy ofself). -
Returns
selfif any characters are removed,nilotherwise.
Related: see Modifying.
Returns the integer hash value for self.
Two String objects that have identical content and compatible encodings also have the same hash value; see Object#hash and Encodings:
s = 'foo' h = s.hash h == 'foo'.hash h == 'food'.hash h == 'FOO'.hash s0 = "äöü" s1 = s0.encode(Encoding::ISO_8859_1) s0.encoding s1.encoding s0.hash == s1.hash
Related: see Querying.
Interprets the leading substring of self as hexadecimal, possibly signed; returns its value as an integer.
The leading substring is interpreted as hexadecimal when it begins with:
-
One or more character representing hexadecimal digits (each in one of the ranges
'0'..'9','a'..'f', or'A'..'F'); the string to be interpreted ends at the first character that does not represent a hexadecimal digit:'f'.hex '11'.hex 'FFF'.hex 'fffg'.hex 'foo'.hex 'bar'.hex 'deadbeef'.hex
-
'0x'or'0X', followed by one or more hexadecimal digits:'0xfff'.hex '0xfffg'.hex
Any of the above may prefixed with '-', which negates the interpreted value:
'-fff'.hex '-0xFFF'.hex
For any substring not described above, returns zero:
'xxx'.hex ''.hex
Note that, unlike oct, this method interprets only hexadecimal, and not binary, octal, or decimal notations:
'0b111'.hex '0o777'.hex '0d999'.hex
Related: See Converting to Non-String.
Returns whether self contains other_string:
s = 'bar' s.include?('ba') s.include?('ar') s.include?('bar') s.include?('a') s.include?('') s.include?('foo')
Related: see Querying.
Returns the integer position of the first substring that matches the given argument pattern, or nil if none found.
When pattern is a string, returns the index of the first matching substring in self:
'foo'.index('f') 'foo'.index('o') 'foo'.index('oo') 'foo'.index('ooo') 'тест'.index('с') 'こんにちは'.index('ち')
When pattern is a Regexp, returns the index of the first match in self:
'foo'.index(/o./) 'foo'.index(/.o/)
When offset is non-negative, begins the search at position offset; the returned index is relative to the beginning of self:
'bar'.index('r', 0) 'bar'.index('r', 1) 'bar'.index('r', 2) 'bar'.index('r', 3) 'bar'.index(/[r-z]/, 0) 'тест'.index('с', 1) 'тест'.index('с', 2) 'тест'.index('с', 3) 'こんにちは'.index('ち', 2)
With negative integer argument offset, selects the search position by counting backward from the end of self:
'foo'.index('o', -1) 'foo'.index('o', -2) 'foo'.index('o', -3) 'foo'.index('o', -4) 'foo'.index(/o./, -2) 'foo'.index(/.o/, -2)
Related: see Querying.
Inserts the given other_string into self; returns self.
If the given index is non-negative, inserts other_string at offset index:
'foo'.insert(0, 'bar') 'foo'.insert(1, 'bar') 'foo'.insert(3, 'bar') 'тест'.insert(2, 'bar') 'こんにちは'.insert(2, 'bar')
If the index is negative, counts backward from the end of self and inserts other_string after the offset:
'foo'.insert(-2, 'bar')
Related: see Modifying.
Returns a printable version of self, enclosed in double-quotes.
Most printable characters are rendered simply as themselves:
'abc'.inspect '012'.inspect ''.inspect "\u000012".inspect 'тест'.inspect 'こんにちは'.inspect
But printable characters double-quote ('"') and backslash and ('\') are escaped:
'"'.inspect '\\'.inspect
Unprintable characters are the ASCII characters whose values are in range 0..31, along with the character whose value is 127.
Most of these characters are rendered thus:
0.chr.inspect 1.chr.inspect 2.chr.inspect
A few, however, have special renderings:
7.chr.inspect 8.chr.inspect 9.chr.inspect 10.chr.inspect 11.chr.inspect 12.chr.inspect 13.chr.inspect 27.chr.inspect
Related: see Converting to Non-String.
Returns the Symbol object derived from self, creating it if it did not already exist:
'foo'.intern 'тест'.intern 'こんにちは'.intern
Related: see Converting to Non-String.
Returns the count of characters (not bytes) in self:
'foo'.length 'тест'.length 'こんにちは'.length
Contrast with String#bytesize:
'foo'.bytesize 'тест'.bytesize 'こんにちは'.bytesize
Related: see Querying.
Returns substrings (“lines”) of self according to the given arguments:
s = <<~EOT This is the first line. This is line two. This is line four. This is line five. EOT
With the default argument values:
$/ s.lines ["This is the first line.\n", "This is line two.\n", "\n", "This is line four.\n", "This is line five.\n"]
With a different record_separator:
record_separator = ' is ' s.lines(record_separator) ["This is ", "the first line.\nThis is ", "line two.\n\nThis is ", "line four.\nThis is ", "line five.\n"]
With keyword argument chomp as true, removes the trailing newline from each line:
s.lines(chomp: true) ["This is the first line.", "This is line two.", "", "This is line four.", "This is line five."]
Related: see Converting to Non-String.
Returns a copy of self, left-justified and, if necessary, right-padded with the pad_string:
'hello'.ljust(10) ' hello'.ljust(10) 'hello'.ljust(10, 'ab') 'тест'.ljust(10) 'こんにちは'.ljust(10)
If width <= self.length, returns a copy of self:
'hello'.ljust(5) 'hello'.ljust(1)
Related: see Converting to New String.
Returns a copy of self with leading whitespace removed; see Whitespace in Strings:
whitespace = "\x00\t\n\v\f\r " s = whitespace + 'abc' + whitespace s.lstrip
If selectors are given, removes characters of selectors from the beginning of self:
s = "---abc+++" s.lstrip("-")
selectors must be valid character selectors (see Character Selectors), and may use any of its valid forms, including negation, ranges, and escapes:
"01234abc56789".lstrip("0-9") "01234abc56789".lstrip("0-9", "^4-6")
Related: see Converting to New String.
Like String#lstrip, except that:
-
Performs stripping in
self(not in a copy ofself). -
Returns
selfif any characters are stripped,nilotherwise.
Related: see Modifying.
Creates a MatchData object based on self and the given arguments; updates Regexp Global Variables.
-
Computes
regexpby convertingpattern(if not already aRegexp).regexp = Regexp.new(pattern)
-
Computes
matchdata, which will be either aMatchDataobject ornil(seeRegexp#match):matchdata = regexp.match(self[offset..])
With no block given, returns the computed matchdata or nil:
'foo'.match('f') 'foo'.match('o') 'foo'.match('x') 'foo'.match('f', 1) 'foo'.match('o', 1)
With a block given and computed matchdata non-nil, calls the block with matchdata; returns the block’s return value:
'foo'.match(/o/) {|matchdata| matchdata }
With a block given and nil matchdata, does not call the block:
'foo'.match(/x/) {|matchdata| fail 'Cannot happen' }
Related: see Querying.
Returns whether a match is found for self and the given arguments; does not update Regexp Global Variables.
Computes regexp by converting pattern (if not already a Regexp):
regexp = Regexp.new(pattern)
Returns true if self[offset..].match(regexp) returns a MatchData object, false otherwise:
'foo'.match?(/o/) 'foo'.match?('o') 'foo'.match?(/x/) 'foo'.match?('f', 1) 'foo'.match?('o', 1)
Related: see Querying.
Interprets the leading substring of self as octal, binary, decimal, or hexadecimal, possibly signed; returns their value as an integer.
In brief:
'777'.oct '777x'.oct '0777'.oct '0o777'.oct '-777'.oct '0b111'.oct '0d999'.oct '0xfff'.oct
The leading substring is interpreted as octal when it begins with:
-
One or more character representing octal digits (each in the range
'0'..'7'); the string to be interpreted ends at the first character that does not represent an octal digit:'7'.oct @ => 7 '11'.oct # => 9 '777'.oct # => 511 '0777'.oct # => 511 '7778'.oct # => 511 '777x'.oct # => 511
-
'0o', followed by one or more octal digits:'0o777'.oct '0o7778'.oct
The leading substring is not interpreted as octal when it begins with:
-
'0b', followed by one or more characters representing binary digits (each in the range'0'..'1'); the string to be interpreted ends at the first character that does not represent a binary digit. the string is interpreted as binary digits (base 2):'0b111'.oct '0b1112'.oct
-
'0d', followed by one or more characters representing decimal digits (each in the range'0'..'9'); the string to be interpreted ends at the first character that does not represent a decimal digit. the string is interpreted as decimal digits (base 10):'0d999'.oct '0d999x'.oct
-
'0x', followed by one or more characters representing hexadecimal digits (each in one of the ranges'0'..'9','a'..'f', or'A'..'F'); the string to be interpreted ends at the first character that does not represent a hexadecimal digit. the string is interpreted as hexadecimal digits (base 16):'0xfff'.oct '0xfffg'.oct
Any of the above may prefixed with '-', which negates the interpreted value:
'-777'.oct '-0777'.oct '-0b111'.oct '-0xfff'.oct
For any substring not described above, returns zero:
'foo'.oct ''.oct
Related: see Converting to Non-String.
Returns the integer ordinal of the first character of self:
'h'.ord 'hello'.ord 'тест'.ord 'こんにちは'.ord
Related: see Converting to Non-String.
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/) 'hello'.partition(/l/) 'hello'.partition(/l+/) 'hello'.partition(/o/) 'hello'.partition(/^/) 'hello'.partition(//) 'hello'.partition(/$/) 'hello'.partition(/x/)
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') 'hello'.partition('l') 'hello'.partition('ll') 'hello'.partition('o') 'hello'.partition('') 'hello'.partition('x') 'тест'.partition('т') 'こんにちは'.partition('に')
Related: see Converting to Non-String.
Prefixes to self the concatenation of the given other_strings; returns self:
'baz'.prepend('foo', 'bar')
Related: see Modifying.
Replaces the contents of self with the contents of other_string; returns self:
s = 'foo' s.replace('bar')
Related: see Modifying.
Returns a new string with the characters from self in reverse order.
'drawer'.reverse 'reviled'.reverse 'stressed'.reverse 'semordnilaps'.reverse
Related: see Converting to New String.
Returns self with its characters reversed:
'drawer'.reverse! 'reviled'.reverse! 'stressed'.reverse! 'semordnilaps'.reverse!
Related: see Modifying.
Returns the integer position of the last substring that matches the given argument pattern, or nil if none found.
When pattern is a string, returns the index of the last matching substring in self:
'foo'.rindex('f') # => 0
'foo'.rindex('o') # => 2
'foo'.rindex('oo' # => 1
'foo'.rindex('ooo') # => nil
'тест'.rindex('т') # => 3
'こんにちは'.rindex('ち') # => 3
When pattern is a Regexp, returns the index of the last match in self:
'foo'.rindex(/f/) 'foo'.rindex(/o/) 'foo'.rindex(/oo/) 'foo'.rindex(/ooo/)
When offset is non-negative, it specifies the maximum starting position in the string to end the search:
'foo'.rindex('o', 0) 'foo'.rindex('o', 1) 'foo'.rindex('o', 2) 'foo'.rindex('o', 3)
With negative integer argument offset, selects the search position by counting backward from the end of self:
'foo'.rindex('o', -1) 'foo'.rindex('o', -2) 'foo'.rindex('o', -3) 'foo'.rindex('o', -4)
The last match means starting at the possible last position, not the last of longest matches:
'foo'.rindex(/o+/) $~
To get the last longest match, combine with negative lookbehind:
'foo'.rindex(/(?<!o)o+/) $~
Or String#index with negative lookforward.
'foo'.index(/o+(?!.*o)/) $~
Related: see Querying.
Returns a right-justified copy of self.
If integer argument width is greater than the size (in characters) of self, returns a new string of length width that is a copy of self, right justified and padded on the left with pad_string:
'hello'.rjust(10) 'hello '.rjust(10) 'hello'.rjust(10, 'ab') 'тест'.rjust(10) 'こんにちは'.rjust(10)
If width <= self.size, returns a copy of self:
'hello'.rjust(5, 'ab') 'hello'.rjust(1, 'ab')
Related: see Converting to New String.
Returns a 3-element array of substrings of self.
Searches self for a match of pattern, seeking the last match.
If pattern is not matched, returns the array:
["", "", self.dup]
If pattern is matched, returns the array:
[pre_match, last_match, post_match]
where:
-
last_matchis the last-found matching substring. -
pre_matchandpost_matchare the preceding and following substrings.
The pattern used is:
-
patternitself, if it is aRegexp. -
Regexp.quote(pattern), ifpatternis a string.
Note that in the examples below, a returned string 'hello' is a copy of self, not self.
If pattern is a Regexp, searches for the last matching substring (also setting matched-data global variables):
'hello'.rpartition(/l/) 'hello'.rpartition(/ll/) 'hello'.rpartition(/h/) 'hello'.rpartition(/o/) 'hello'.rpartition(//) 'hello'.rpartition(/x/) 'тест'.rpartition(/т/) 'こんにちは'.rpartition(/に/)
If pattern is not a Regexp, converts it to a string (if it is not already one), then searches for the last matching substring (and does not set matched-data global variables):
'hello'.rpartition('l') 'hello'.rpartition('ll') 'hello'.rpartition('h') 'hello'.rpartition('o') 'hello'.rpartition('') 'тест'.rpartition('т') 'こんにちは'.rpartition('に')
Related: see Converting to Non-String.
Returns a copy of self with trailing whitespace removed; see Whitespace in Strings:
whitespace = "\x00\t\n\v\f\r " s = whitespace + 'abc' + whitespace s s.rstrip
If selectors are given, removes characters of selectors from the end of self:
s = "---abc+++" s.rstrip("+")
selectors must be valid character selectors (see Character Selectors), and may use any of its valid forms, including negation, ranges, and escapes:
"01234abc56789".rstrip("0-9") "01234abc56789".rstrip("0-9", "^4-6")
Related: see Converting to New String.
Like String#rstrip, except that:
-
Performs stripping in
self(not in a copy ofself). -
Returns
selfif any characters are stripped,nilotherwise.
Related: see Modifying.
Matches a pattern against self:
-
If
patternis aRegexp, the pattern used ispatternitself. -
If
patternis a string, the pattern used isRegexp.quote(pattern).
Generates a collection of matching results and updates regexp-related global variables:
-
If the pattern contains no groups, each result is a matched substring.
-
If the pattern contains groups, each result is an array containing a matched substring for each group.
With no block given, returns an array of the results:
'cruel world'.scan(/\w+/) 'cruel world'.scan(/.../) 'cruel world'.scan(/(...)/) 'cruel world'.scan(/(..)(..)/) 'тест'.scan(/../) 'こんにちは'.scan(/../) 'abracadabra'.scan('ab') 'abracadabra'.scan('nosuch')
With a block given, calls the block with each result; returns self:
'cruel world'.scan(/\w+/) {|w| p w } 'cruel world'.scan(/(.)(.)/) {|x, y| p [x, y] }
Related: see Converting to Non-String.
Returns a copy of self with each invalid byte sequence replaced by the given replacement_string.
With no block given, replaces each invalid sequence with the given default_replacement_string (by default, "�" for a Unicode encoding, '?' otherwise):
"foo\x81\x81bar"scrub # => "foo��bar"
"foo\x81\x81bar".force_encoding('US-ASCII').scrub # => "foo??bar"
"foo\x81\x81bar".scrub('xyzzy') # => "fooxyzzyxyzzybar"
With a block given, calls the block with each invalid sequence, and replaces that sequence with the return value of the block:
"foo\x81\x81bar".scrub {|sequence| p sequence; 'XYZZY' }
Output :
"\x81" "\x81"
Related: see Converting to New String.
Sets the byte at zero-based offset index to the value of the given integer; returns integer:
s = 'xyzzy' s.setbyte(2, 129) s
Related: see Modifying.
Escapes str so that it can be safely used in a Bourne shell command line.
See Shellwords.shellescape for details.
Splits str into an array of tokens in the same way the UNIX Bourne shell does.
See Shellwords.shellsplit for details.
Like String#[] (and its alias String#slice), except that:
-
Performs substitutions in
self(not in a copy ofself). -
Returns the removed substring if any modifications were made,
nilotherwise.
A few examples:
s = 'hello' s.slice!('e') s s.slice!('e') s
Related: see Modifying.
Creates an array of substrings by splitting self at each occurrence of the given field separator field_sep.
With no arguments given, splits using the field separator $;, whose default value is nil.
With no block given, returns the array of substrings:
'abracadabra'.split('a')
When field_sep is nil or ' ' (a single space), splits at each sequence of whitespace:
'foo bar baz'.split(nil) 'foo bar baz'.split(' ') "foo \n\tbar\t\n baz".split(' ') 'foo bar baz'.split(' ') ''.split(' ')
When field_sep is an empty string, splits at every character:
'abracadabra'.split('') ''.split('') 'тест'.split('') 'こんにちは'.split('')
When field_sep is a non-empty string and different from ' ' (a single space), uses that string as the separator:
'abracadabra'.split('a') 'abracadabra'.split('ab') ''.split('a') 'тест'.split('т') 'こんにちは'.split('に')
When field_sep is a Regexp, splits at each occurrence of a matching substring:
'abracadabra'.split(/ab/) '1 + 1 == 2'.split(/\W+/) 'abracadabra'.split(//)
If the Regexp contains groups, their matches are included in the returned array:
'1:2:3'.split(/(:)()()/, 2)
Argument limit sets a limit on the size of the returned array; it also determines whether trailing empty strings are included in the returned array.
When limit is zero, there is no limit on the size of the array, but trailing empty strings are omitted:
'abracadabra'.split('', 0) 'abracadabra'.split('a', 0)
When limit is a positive integer, there is a limit on the size of the array (no more than n - 1 splits occur), and trailing empty strings are included:
'abracadabra'.split('', 3) 'abracadabra'.split('a', 3) 'abracadabra'.split('', 30) 'abracadabra'.split('a', 30) 'abracadabra'.split('', 1) 'abracadabra'.split('a', 1)
When limit is negative, there is no limit on the size of the array, and trailing empty strings are omitted:
'abracadabra'.split('', -1) 'abracadabra'.split('a', -1)
If a block is given, it is called with each substring and returns self:
'foo bar baz'.split(' ') {|substring| p substring }
Output :
"foo" "bar" "baz"
Note that the above example is functionally equivalent to:
'foo bar baz'.split(' ').each {|substring| p substring }
Output :
"foo" "bar" "baz"
But the latter:
-
Has poorer performance because it creates an intermediate array.
-
Returns an array (instead of
self).
Related: see Converting to Non-String.
Returns a copy of self with each tuple (doubling, tripling, etc.) of specified characters “squeezed” down to a single character.
The tuples to be squeezed are specified by arguments selectors, each of which is a string; see Character Selectors.
A single argument may be a single character:
'Noooooo!'.squeeze('o') 'foo bar baz'.squeeze(' ') 'Mississippi'.squeeze('s') 'Mississippi'.squeeze('p') 'Mississippi'.squeeze('x') 'бессонница'.squeeze('с') 'бессонница'.squeeze('н')
A single argument may be a string of characters:
'Mississippi'.squeeze('sp') 'Mississippi'.squeeze('ps') 'Mississippi'.squeeze('nonsense')
A single argument may be a range of characters:
'Mississippi'.squeeze('a-p') 'Mississippi'.squeeze('q-z') 'Mississippi'.squeeze('a-z')
Multiple arguments are allowed; see Multiple Character Selectors.
Related: see Converting to New String.
Like String#squeeze, except that:
-
Characters are squeezed in
self(not in a copy ofself). -
Returns
selfif any changes are made,nilotherwise.
Related: See Modifying.
Returns whether self starts with any of the given patterns.
For each argument, the pattern used is:
-
The pattern itself, if it is a
Regexp. -
Regexp.quote(pattern), if it is a string.
Returns true if any pattern matches the beginning, false otherwise:
'hello'.start_with?('hell') 'hello'.start_with?(/H/i) 'hello'.start_with?('heaven', 'hell') 'hello'.start_with?('heaven', 'paradise') 'тест'.start_with?('т') 'こんにちは'.start_with?('こ')
Related: see Querying.
Returns a copy of self with leading and trailing whitespace removed; see Whitespace in Strings:
whitespace = "\x00\t\n\v\f\r " s = whitespace + 'abc' + whitespace s.strip
If selectors are given, removes characters of selectors from both ends of self:
s = "---abc+++" s.strip("-+") s.strip("+-")
selectors must be valid character selectors (see Character Selectors), and may use any of its valid forms, including negation, ranges, and escapes:
"01234abc56789".strip("0-9") "01234abc56789".strip("0-9", "^4-6")
Related: see Converting to New String.
Like String#strip, except that:
-
Any modifications are made to
self. -
Returns
selfif any modification are made,nilotherwise.
Related: see Modifying.
Returns a copy of self, possibly with a substring replaced.
Argument pattern may be a string or a Regexp; argument replacement may be a string or a Hash.
Varying types for the argument values makes this method very versatile.
Below are some simple examples; for many more examples, see Substitution Methods.
With arguments pattern and string replacement given, replaces the first matching substring with the given replacement string:
s = 'abracadabra' s.sub('bra', 'xyzzy') s.sub(/bra/, 'xyzzy') s.sub('nope', 'xyzzy')
With arguments pattern and hash replacement given, replaces the first matching substring with a value from the given replacement hash, or removes it:
h = {'a' => 'A', 'b' => 'B', 'c' => 'C'} s.sub('b', h) s.sub(/b/, h) s.sub(/d/, h)
With argument pattern and a block given, calls the block with each matching substring; replaces that substring with the block’s return value:
s.sub('b') {|match| match.upcase }
Related: see Converting to New String.
Like String#sub, except that:
-
Changes are made to
self, not to copy ofself. -
Returns
selfif any changes are made,nilotherwise.
Related: see Modifying.
Returns the successor to self. The successor is calculated by incrementing characters.
The first character to be incremented is the rightmost alphanumeric: or, if no alphanumerics, the rightmost character:
'THX1138'.succ '<<koala>>'.succ '***'.succ 'тест'.succ 'こんにちは'.succ
The successor to a digit is another digit, “carrying” to the next-left character for a “rollover” from 9 to 0, and prepending another digit if necessary:
'00'.succ '09'.succ '99'.succ
The successor to a letter is another letter of the same case, carrying to the next-left character for a rollover, and prepending another same-case letter if necessary:
'aa'.succ 'az'.succ 'zz'.succ 'AA'.succ 'AZ'.succ 'ZZ'.succ
The successor to a non-alphanumeric character is the next character in the underlying character set’s collating sequence, carrying to the next-left character for a rollover, and prepending another character if necessary:
s = 0.chr * 3 s.succ s = 255.chr * 3 s.succ
Carrying can occur between and among mixtures of alphanumeric characters:
s = 'zz99zz99' s.succ s = '99zz99zz' s.succ
The successor to an empty String is a new empty String:
''.succ
Related: see Converting to New String.
Returns a basic n-bit checksum of the characters in self; the checksum is the sum of the binary value of each byte in self, modulo 2**n - 1:
'hello'.sum 'hello'.sum(4) 'hello'.sum(64) 'тест'.sum 'こんにちは'.sum
This is not a particularly strong checksum.
Related: see Querying.
Returns a string containing the characters in self, with cases reversed:
-
Each uppercase character is downcased.
-
Each lowercase character is upcased.
Examples:
'Hello'.swapcase 'Straße'.swapcase 'Привет'.swapcase 'RubyGems.org'.swapcase
The sizes of self and the upcased result may differ:
s = 'Straße' s.size s.swapcase s.swapcase.size
Some characters (and some character sets) do not have upcase and downcase versions; see Case Mapping:
s = '1, 2, 3, ...' s.swapcase == s s = 'こんにちは' s.swapcase == s
The casing is affected by the given mapping, which may be :ascii, :fold, or :turkic; see Case Mappings.
Related: see Converting to New String.
Like String#swapcase, except that:
-
Changes are made to
self, not to copy ofself. -
Returns
selfif any changes are made,nilotherwise.
Related: see Modifying.
Returns a Complex object: parses the leading substring of self to extract two numeric values that become the coordinates of the complex object.
The substring is interpreted as containing either rectangular coordinates (real and imaginary parts) or polar coordinates (magnitude and angle parts), depending on an included or implied “separator” character:
-
'+','-', or no separator: rectangular coordinates. -
'@': polar coordinates.
In Brief
In these examples, we use method Complex#rect to display rectangular coordinates, and method Complex#polar to display polar coordinates.
# Rectangular coordinates.
# Real-only: no separator; imaginary part is zero.
'9'.to_c.rect # => [9, 0] # Integer.
'-9'.to_c.rect # => [-9, 0] # Integer (negative).
'2.5'.to_c.rect # => [2.5, 0] # Float.
'1.23e-14'.to_c.rect # => [1.23e-14, 0] # Float with exponent.
'2.5/1'.to_c.rect # => [(5/2), 0] # Rational.
# Some things are ignored.
'foo1'.to_c.rect # => [0, 0] # Unparsed entire substring.
'1foo'.to_c.rect # => [1, 0] # Unparsed trailing substring.
' 1 '.to_c.rect # => [1, 0] # Leading and trailing whitespace.
*
# Imaginary only: trailing 'i' required; real part is zero.
'9i'.to_c.rect # => [0, 9]
'-9i'.to_c.rect # => [0, -9]
'2.5i'.to_c.rect # => [0, 2.5]
'1.23e-14i'.to_c.rect # => [0, 1.23e-14]
'2.5/1i'.to_c.rect # => [0, (5/2)]
# Real and imaginary; '+' or '-' separator; trailing 'i' required.
'2+3i'.to_c.rect # => [2, 3]
'-2-3i'.to_c.rect # => [-2, -3]
'2.5+3i'.to_c.rect # => [2.5, 3]
'2.5+3/2i'.to_c.rect # => [2.5, (3/2)]
# Polar coordinates; '@' separator; magnitude required.
'1.0@0'.to_c.polar # => [1.0, 0.0]
'1.0@'.to_c.polar # => [1.0, 0.0]
"1.0@#{Math::PI}".to_c.polar # => [1.0, 3.141592653589793]
"1.0@#{Math::PI/2}".to_c.polar # => [1.0, 1.5707963267948966]
Parsed Values
The parsing may be thought of as searching for numeric literals embedded in the substring.
This section shows how the method parses numeric values from leading substrings. The examples show real-only or imaginary-only parsing; the parsing is the same for each part.
'1foo'.to_c ' 1 '.to_c 'x1'.to_c '1'.to_c '-1'.to_c '1i'.to_c '0b100'.to_c '0o100'.to_c '0d100'.to_c '0x100'.to_c '010'.to_c '3.14'.to_c '3.14i'.to_c '1.23e4'.to_c '1.23e+4'.to_c '1.23e-4'.to_c '1/2'.to_c '-1/2'.to_c '1/2r'.to_c '-1/2r'.to_c
Rectangular Coordinates
With separator '+' or '-', or with no separator, interprets the values as rectangular coordinates: real and imaginary.
With no separator, assigns a single value to either the real or the imaginary part:
''.to_c '1'.to_c '1i'.to_c 'i'.to_c
With separator '+', both parts positive (or zero):
'+'.to_c '+1'.to_c '1+'.to_c '2+1'.to_c '+1i'.to_c '2+i'.to_c '2+1i'.to_c
With separator '-', negative imaginary part:
'-'.to_c '-1'.to_c '1-'.to_c '2-1'.to_c '-1i'.to_c '2-i'.to_c '2-1i'.to_c
Note that the suffixed character 'i' may instead be one of 'I', 'j', or 'J', with the same effect.
Polar Coordinates
With separator '@') interprets the values as polar coordinates: magnitude and angle.
'2@'.to_c.polar '2@1'.to_c.polar "1.0@#{Math::PI/2}".to_c "1.0@#{Math::PI}".to_c '@'.to_c.polar '@1'.to_c.polar '1.0@0'.to_c
Note that in all cases, the suffixed character 'i' may instead be one of 'I', 'j', 'J', with the same effect.
Returns the result of interpreting leading characters in +self+ as a Float: '3.14159'.to_f # => 3.14159 '1.234e-2'.to_f # => 0.01234 Characters past a leading valid number are ignored: '3.14 (pi to two places)'.to_f # => 3.14 Returns zero if there is no leading valid number: 'abcdef'.to_f # => 0.0
Returns the result of interpreting leading characters in self as an integer in the given base; base must be either 0 or in range (2..36):
'123456'.to_i '123def'.to_i(16)
With base zero given, string object may contain leading characters to specify the actual base:
'123def'.to_i(0) '0123def'.to_i(0) '0b123def'.to_i(0) '0o123def'.to_i(0) '0d123def'.to_i(0) '0x123def'.to_i(0)
Characters past a leading valid number (in the given base) are ignored:
'12.345'.to_i '12345'.to_i(2)
Returns zero if there is no leading valid number:
'abcdef'.to_i '2'.to_i(2)
Related: see Converting to Non-String.
This method creates a raw object hash, that can be nested into other data structures and will be generated as a raw string. This method should be used, if you want to convert raw strings to JSON instead of UTF-8 strings, e. g. binary data.
Returns the result of interpreting leading characters in self as a rational value:
'123'.to_r '300/2'.to_r '-9.2'.to_r '-9.2e2'.to_r
Ignores leading and trailing whitespace, and trailing non-numeric characters:
' 2 '.to_r '21-Jun-09'.to_r
Returns Rational zero if there are no leading numeric characters.
'BWV 1079'.to_r
NOTE: '0.3'.to_r is equivalent to 3/10r, but is different from 0.3.to_r:
'0.3'.to_r 3/10r 0.3.to_r
Related: see Converting to Non-String.
Returns a copy of self with each character specified by string selector translated to the corresponding character in string replacements. The correspondence is positional:
-
Each occurrence of the first character specified by
selectoris translated to the first character inreplacements. -
Each occurrence of the second character specified by
selectoris translated to the second character inreplacements. -
And so on.
Example:
'hello'.tr('el', 'ip')
If replacements is shorter than selector, it is implicitly padded with its own last character:
'hello'.tr('aeiou', '-') 'hello'.tr('aeiou', 'AA-')
Arguments selector and replacements must be valid character selectors (see Character Selectors), and may use any of its valid forms, including negation, ranges, and escapes:
'hello'.tr('^aeiou', '-') 'ibm'.tr('b-z', 'a-z') 'hel^lo'.tr('\^aeiou', '-') 'i-b-m'.tr('b\-z', 'a-z') 'foo\\bar'.tr('ab\\', 'XYZ')
Related: see Converting to New String.
Like String#tr, except:
-
Performs substitutions in
self(not in a copy ofself). -
Returns
selfif any modifications were made,nilotherwise.
Related: Modifying.
Like String#tr, except:
-
Also squeezes the modified portions of the translated string; see
String#squeeze. -
Returns the translated and squeezed string.
Examples:
'hello'.tr_s('l', 'r') 'hello'.tr_s('el', '-') 'hello'.tr_s('el', 'hx')
Related: see Converting to New String.
Like String#tr_s, except:
-
Modifies
selfin place (not a copy ofself). -
Returns
selfif any changes were made,nilotherwise.
Related: Modifying.
Returns a copy of self with Unicode normalization applied.
Argument form must be one of the following symbols (see Unicode normalization forms):
-
:nfc: Canonical decomposition, followed by canonical composition. -
:nfd: Canonical decomposition. -
:nfkc: Compatibility decomposition, followed by canonical composition. -
:nfkd: Compatibility decomposition.
The encoding of self must be one of:
-
Encoding::UTF_8. -
Encoding::UTF_16BE. -
Encoding::UTF_16LE. -
Encoding::UTF_32BE. -
Encoding::UTF_32LE. -
Encoding::GB18030. -
Encoding::UCS_2BE. -
Encoding::UCS_4BE.
Examples:
"a\u0300".unicode_normalize "a\u0300".unicode_normalize(:nfd)
Related: see Converting to New String.
Returns whether self is in the given form of Unicode normalization; see String#unicode_normalize.
The form must be one of :nfc, :nfd, :nfkc, or :nfkd.
Examples:
"a\u0300".unicode_normalized? "a\u0300".unicode_normalized?(:nfd) "\u00E0".unicode_normalized? "\u00E0".unicode_normalized?(:nfd)
Raises an exception if self is not in a Unicode encoding:
s = "\xE0".force_encoding(Encoding::ISO_8859_1) s.unicode_normalized?
Related: see Querying.
Extracts data from self to form new objects; see Packed Data.
With a block given, calls the block with each unpacked object.
With no block given, returns an array containing the unpacked objects.
Related: see Converting to Non-String.
Returns a new string containing the upcased characters in self:
'hello'.upcase 'straße'.upcase 'привет'.upcase 'RubyGems.org'.upcase
The sizes of self and the upcased result may differ:
s = 'Straße' s.size s.upcase s.upcase.size
Some characters (and some character sets) do not have upcase and downcase versions; see Case Mapping:
s = '1, 2, 3, ...' s.upcase == s s = 'こんにちは' s.upcase == s
The casing is affected by the given mapping, which may be :ascii, :fold, or :turkic; see Case Mappings.
Related: see Converting to New String.
Like String#upcase, except that:
-
Changes character casings in
self(not in a copy ofself). -
Returns
selfif any changes are made,nilotherwise.
Related: See Modifying.
With a block given, calls the block with each String value returned by successive calls to String#succ; the first value is self, the next is self.succ, and so on; the sequence terminates when value other_string is reached; returns self:
a = [] 'a'.upto('f') {|c| a.push(c) } a a = [] 'Ж'.upto('П') {|c| a.push(c) } a a = [] 'よ'.upto('ろ') {|c| a.push(c) } a a = [] 'a8'.upto('b6') {|c| a.push(c) } a
If argument exclusive is given as a truthy object, the last value is omitted:
a = [] 'a'.upto('f', true) {|c| a.push(c) } a
If other_string would not be reached, does not call the block:
'25'.upto('5') {|s| fail s } 'aa'.upto('a') {|s| fail s }
With no block given, returns a new Enumerator:
'a8'.upto('b6')
Related: see Iterating.
Returns whether self is encoded correctly:
s = 'Straße' s.valid_encoding? s.encoding s.force_encoding(Encoding::ASCII).valid_encoding?
Related: see Querying.