Need a reference text for the Ruby programming language? Get the Well-Grounded Rubyist.
This article will briefly go over Strings in Ruby.
First, let us talk about a few String methods. You can see all the methods available to a string if you call the "methods" method:
"Some String".methods
=> [:<=>, :==, :===, :eql?, :hash, :casecmp, :+, :*, :%, :[], :[]=,
:insert, :length, :size, :bytesize, :empty?, :=~, :match, :succ,
:succ!, :next, :next!, :upto, :index, :rindex, :replace, :clear,
:chr, :getbyte, :setbyte, :byteslice, :scrub, :scrub!, :freeze,
:to_i, :to_f, :to_s, :to_str, :inspect, :dump, :upcase, :downcase,
:capitalize, :swapcase, :upcase!, :downcase!, :capitalize!, :swapcase!,
:hex, :oct, :split, :lines, :bytes, :chars, :codepoints, :reverse,
:reverse!, :concat, :<<, :prepend, :crypt, :intern, :to_sym, :ord,
:include?, :start_with?, :end_with?, :scan, :ljust, :rjust, :center,
(output omitted)
:public_send, :respond_to?, :extend, :display, :method, :public_method,
:singleton_method, :define_singleton_method, :object_id, :to_enum,
:enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__,
:__id__]
There are many methods you could use, but here we will just talk about a few.
To start off, if you want to change the case of a string, you can either make it upper case or lower case with the following methods:
"Hello".upcase
"World".downcase
Output:
=> "HELLO"
=> "world"
There is a method that capitalizes the first character in the string and makes everything else lowercase:
"How ARe You dOIng toDAY?".capitalize
=> "How are you doing today?"
You can get rid of trailing spaces (either from the left or from the right) using the lstrip/rstrip method:
" , And then ".lstrip
=> ", And then "
" , And then ".rstrip
=> " , And then"
Now, if you had those strings in a variable and you called all those methods, the original string would not change. That is, you would get a copy of the original string that was transformed according to the method you called. If you really want to change the original string, you would have to use the exclamation point, like this:
my_word = "Hello"
# Uppercases my_word permanently
my_word.upcase!
puts my_word
Output:
=> "HELLO"
Compare the use of no exclamation with one actually present:
sentence = "I climbed a tree."
another_sentence = sentence.upcase
puts "Original sentence: #{sentence}"
puts "Another sentence: #{another_sentence}"
sentence.upcase!
puts "Now sentence is: #{sentence}"
Output:
Original sentence: I climbed a tree.
Another sentence: I CLIMBED A TREE.
Now sentence is: I CLIMBED A TREE.
So in the code above we define a string variable and then create another string variable that takes the uppercase version of that original variable. Upon printing both of those variables, you see that the original is still unchanged while the second one has all its letters uppercase.
The code above uses string interpolation to display the value of a string variable. If you don't know about this, it is simple: within a double-quoted string, use #{} and place the variable name inside to actually display its value when you use puts. That is, puts "Something bla bla #{some_variable} will be displayed"
Now, moving on. The second part of the code calls the upcase method with a bang, !. Now, the actual variable will be modified. Whatever is stored in sentence will be turned into uppercase permanently. When you call puts to display the value of sentence, you see it is indeed a string with all characters uppercase.
Let us now talk about other more advanced methods. Before that, know that you can access any character in the string using standard array access notation:
my_string = "Somewhere over the rainbow"
# Displays the fourth character in the string (counts from 0)
puts my_string[3]
Output:
=> e
A useful method to search for a substring is the include?
method.
"Welcome to my world".include? "world"
=> true
"Welcome to my world".include? "to"
=> true
"Welcome to my world".include? "earth"
=> false
So the method returns either true, if the sequence of characters was found in the string, or false, if the sequence of characters was not found.
The include? method can also take just a single character, if you use either "x", 'x', or ?x, where x is any character.
"Hello".include? 'e'
=> true
# Does it include the character e? (same as above)
"Hello".include? ?e
=> true
Now, another useful method is the sub method. You can substitute characters in a string with something else.
"I went to the gym today.".sub 'gym', 'theater'
Output (irb):
irb(main):023:0> "I went to the gym today.".sub 'gym', 'theater'
=> "I went to the theater today."
So the method sub substitutes a given string with a new string. Note that it does not change the original string, but makes a copy. If you want to actually change the original string (when working with variables), use the exclamation point:
sentence = "I ate pasta yesterday."
another_sentence = sentence.sub 'pasta', 'cake'
puts sentence
puts another_sentence
# Modify "sentence" variable permanently
sentence.sub! 'pasta', 'cake'
puts sentence
Output:
I ate pasta yesterday.
I ate cake yesterday.
I ate cake yesterday.
Note that the sub method substitutes only once. That is, the first match it finds will be the only one changed:
irb(main):002:0> sentence = "I love to eat a lot of pasta pasta much pasta"
=> "I love to eat a lot of pasta pasta much pasta"
irb(main):003:0> sentence
=> "I love to eat a lot of pasta pasta much pasta"
irb(main):004:0> sentence.sub 'pasta', 'pizza'
=> "I love to eat a lot of pizza pasta much pasta"
irb(main):005:0> sentence
=> "I love to eat a lot of pasta pasta much pasta"
That is all for this article. We talked about how you can modify strings using upcase, downcase, capitalize, as well as how to modify the original array using the exclamation (!) point. Then we looked at how to find matches in a string using include? and how to substitute matches with the sub method. There are many methods out there, so you could use the method "methods" to find out which methods are available to each class object.
Looking for a reference text for Ruby? Get the Well-Grounded Rubyist.