I am new to ruby, and was trying to make a small code which would check
if a string has only new line character in it. At the end I found that a
method “inspect” will do the trick.
Is that the only way to handle new line characters?
How about other special characters, if there is a need to search for
them in a text?
Code that didn’t work:
if txtArray[i] <=> “\n” then
Code that worked:
if txtArray[i].inspect <=> “\n” then
Actually inspect didn’t work. I had a typo :), please help
Thanks for all comments.
I assume that txtArray is a String in spite of the name. If so, then
your
comparison is probably easiest done through regular expressions:
if txtArray =~ /\n/
…
end
Thanks, that worked.
I am on the way of learning more, and there is so much to learn!
On Sat, Mar 26, 2011 at 06:10:37AM +0900, Damir S. wrote:
Thanks, that worked.
I am on the way of learning more, and there is so much to learn!
There’s also a method call syntax for that:
if string.match("\n")
. . . in case you find circumstances where you’d prefer that approach.
And if you want to replace all the newlines in some text, you can use
gsub():
str =<<ENDOFSTRING
hello world
goodbye
hi again world
ENDOFSTRING
result = str.gsub(/\n/, ’ ')
puts result
–output:–
hello world goodbye hi again world
7stud is right. I missed the important word “only” in your original
email.
My original method will produce false positives if you are indeed
interested in finding strings which are only “\n”.
The “==” method works fine. Regexp is also possible (though probably
slower) if done as:
if str =~ /^\n$/
Actually, that solution does not work, as you can see here:
strings = [“hello\n”, “\n”]
strings.each do |str|
if str =~ /\n/
puts “yes – #{str}”
end
end
–output:–
yes – hello
yes –
If you want to test whether a string contains only a newline, you can
use ==:
strings = [“hello\n”, “\n”]
strings.each do |str|
if str == “\n”
puts “yes -->#{str}<–”
end
end
–output:–
yes -->
<–
Note that double quotes are required around the string “\n” for ruby to
interpret the ‘’ and ‘n’ combination as a newline.
And if what you are really after is to remove a newline at the end of a
string, you can use chomp():
strings = [“hello\n”, “hello”]
strings.each do |str|
puts “–> #{str.chomp} <–”
end
–output:–
–> hello <–
–> hello <–
On Fri, Mar 25, 2011 at 9:28 PM, Damir S. [email protected] wrote:
if txtArray[i] <=> “\n” then
Code that worked:
if txtArray[i].inspect <=> “\n” then
Thanks for all comments.
If you want to remove the trailing newline, this may help as well:
irb(main):005:0> s=“foo\n”
=> “foo\n”
irb(main):006:0> s.chomp! and puts “there was a newline!”
there was a newline!
=> nil
irb(main):007:0> s
=> “foo”
irb(main):008:0> s.chomp! and puts “there was a newline!”
=> nil
Kind regards
robert
On Mon, Mar 28, 2011 at 1:07 PM, Robert K.
[email protected] wrote:
Code that didn’t work:
irb(main):005:0> s=“foo\n”
=> “foo\n”
irb(main):006:0> s.chomp! and puts “there was a newline!”
there was a newline!
=> nil
irb(main):007:0> s
=> “foo”
irb(main):008:0> s.chomp! and puts “there was a newline!”
=> nil
For the “only newline” check you could do
irb(main):010:0> s=“foo\n”
=> “foo\n”
irb(main):011:0> s.chomp! == “”
=> false
irb(main):012:0> s=“\n”
=> “\n”
irb(main):013:0> s.chomp! == “”
=> true
Kind regards
robert
Damir, to know if a string is exactly a newline, please simply use ==:
if str == “\n”
…
end
There are indirect ways to get the same result, you can also go from
Barcelona to Paris via New York, but a straight line is nicer.
Please people stop suggesting regexps for this simple problem.
Chris K. wrote in post #989369:
7stud is right. I missed the important word “only” in your original
email.
My original method will produce false positives if you are indeed
interested in finding strings which are only “\n”.
The “==” method works fine. Regexp is also possible (though probably
slower) if done as:
if str =~ /^\n$/
Wrong - that doesn’t match only strings containing just a newline.
str = “\n”
=> “\n”
str =~ /^\n$/
=> 0
str = “\n\n”
=> “\n\n”
str =~ /^\n$/
=> 0
str = “\n\nabc”
=> “\n\nabc”
str =~ /^\n$/
=> 0
With a regexp, you need str =~ /\A\n\z/
str = “\n”
=> “\n”
str =~ /\A\n\z/
=> 0
str = “\n\n”
=> “\n\n”
str =~ /\A\n\z/
=> nil
str = “\n\nabc”
=> “\n\nabc”
str =~ /\A\n\z/
=> nil
(beware: this is an area where Ruby’s regexps are not the same as
Perl’s regexps)
don’t know if this will help you but ruby 1.9 has the each_line method.
example:
def line_count( s)
c = 0
s.each_line { |l| c+=1 }
return( c)
end
line_count( “I am \na multi\nline\nstring!”)
=> 4
if you want to test against the ascii equivalent in 1.8.7 it’s ?\n and
in 1.9.2 it’s “\n”.ord which should return 10 in decimal format.