Appending to an existing string
You can use <<
to append to a string in-place.
s = "foo"
old_id = s.object_id
s << "bar"
s #=> "foobar"
s.object_id == old_id #=> true
How to add string \n literally at the end of each line in Ruby?
String#gsub
/String#gsub!
plus a very simple regular expression can be used to achieve that:
str = "line1
line2
line3"
str.gsub!(/$/, ' \n')
puts str
Output:
line1 \n
line2 \n
line3 \n
How do I add characters between each character in a string in ruby?
There are many solutions to this, I would suggest the following :
1/ split the string into an array
of individual characters with chars
"hello".chars
=> ["h", "e", "l", "l", "o"]
2/ join
them with the two characters you want to add in-between each character
["h", "e", "l", "l", "o"].join('--')
=> "h--e--l--l--o"
You can execute this in one line as such :
"hello".chars.join('--')
How to delete specific characters from a string in Ruby?
Do as below using String#tr
:
"((String1))".tr('()', '')
# => "String1"
How to mask all but last four characters in a string
positive lookahead
A positive lookahead makes it pretty easy. If any character is followed by at least 4 characters, it gets replaced :
"654321".gsub(/.(?=.{4})/,'#')
# "##4321"
Here's a description of the regex :
r = /
. # Just one character
(?= # which must be followed by
.{4} # 4 characters
) #
/x # free-spacing mode, allows comments inside regex
Note that the regex only matches one character at a time, even though it needs to check up to 5 characters for each match :
"654321".scan(r)
# => ["6", "5"]
/(.)..../
wouldn't work, because it would consume 5 characters for each iteration :
"654321".scan(/(.)..../)
# => [["6"]]
"abcdefghij".scan(/(.)..../)
# => [["a"], ["f"]]
If you want to parametrize the length of the unmasked string, you can use variable interpolation :
all_but = 4
/.(?=.{#{all_but}})/
# => /.(?=.{4})/
Code
Packing it into a method, it becomes :
def mask(string, all_but = 4, char = '#')
string.gsub(/.(?=.{#{all_but}})/, char)
end
p mask('testabcdef')
# '######cdef'
p mask('1234')
# '1234'
p mask('123')
# '123'
p mask('x')
# 'x'
You could also adapt it for sentences :
def mask(string, all_but = 4, char = '#')
string.gsub(/\w(?=\w{#{all_but}})/, char)
end
p mask('It even works for multiple words')
# "It even #orks for ####iple #ords"
Some notes about your code
string.to_s
Naming things is very important in programming, especially in dynamic languages.
string.to_s
If string
is indeed a string, there shouldn't be any reason to call to_s
.
If string
isn't a string, you should indeed call to_s
before gsub
but should also rename string
to a better description :
object.to_s
array.to_s
whatever.to_s
join
puts array.join(", ").delete(", ").inspect
What do you want to do exactly? You could probably just use join
:
[1,2,[3,4]].join(", ").delete(", ")
# "1234"
[1,2,[3,4]].join
# "1234"
delete
Note that .delete(", ")
deletes every comma and every whitespace, in any order. It doesn't only delete ", "
substrings :
",a b,,, cc".delete(', ')
# "abcc"
["1,2", "3,4"].join(', ').delete(', ')
# "1234"
How to check whether a string contains a substring in Ruby
You can use the include?
method:
my_string = "abcdefg"
if my_string.include? "cde"
puts "String includes 'cde'"
end
Inserting Escape Characters
I assume you are reffering to the following problem:
"\\n".gsub(/\\\\/, "\\").gsub(/\\n/, "\n") # => "n"
"\\n".gsub(/\\n/, "\n").gsub(/\\\\/, "\\") # => "\\\n"
String#gsub
can take a block argument, which performs the substitution.
str.gsub(/\\(.)/) do |s|
case $1
when "n"
"\n"
when "t"
"\t"
else
$1
end
end
This way no special escape sequence is substituted first and everything works as expeted.
Related Topics
Deleting Blank Lines After Loop
Replacing an Element in Nested Array Ruby
Sinatra Doesn't Know This Ditty Even When Default Route Is Implemented with Modular Style
How to Make Private Activities
Heroku-18: Git Push Fails. Showing Different Versions of Ruby on Push
To_SQL Not Working on Update_Attributes or .Save
Attr_Accessor, Not Able to Access Property
Rails + Google Calendar API Events Not Created
Proc Throws Error When Used with Do End
How to Use Link_To with Ajax in Rails 3.2.1
Rails: How to Use Scope to Find an Element in Array of Arrays
Why Does the Script Affect Everything on My Rails 3 App Even When Cased in This Code
How to Render the Ajax Response in Rails
No Such File to Load -- Bundler/Setup in Rails 3.2 with Passenger