Hi All
I just tried to test the content of a string, something like this:
c = “1234AA”
if c.scan( /1234567890/ )
p “OK”
else
p “NO”
end
This always returns “OK” ![:frowning: :frowning:](//test.ruby-forum.com/images/emoji/twitter/frowning.png?v=6)
Any suggestions what goes wrong here. And is this the way to check the
content of a string ?
Thanks a lot
LuCa
Luca S. wrote:
Hi All
I just tried to test the content of a string, something like this:
c = “1234AA”
if c.scan( /1234567890/ )
p “OK”
else
p “NO”
end
This always returns “OK” ![:frowning: :frowning:](https://www.ruby-forum.com/images/emoji/apple/frowning.png?v=12)
Any suggestions what goes wrong here. And is this the way to check the
content of a string ?
Thanks a lot
LuCa
(i think) the reason you always get OK, is because the if c.scan always
returns a true value (the scan method always takes place) (i.e, it never
returns nil/false)…i don’t know exactly what method you need, but
first of all check out
http://rubycentral.com/book/ref_c_string.html#String.scan to see that it
returns either an array or a string, and second of all maybe, check out,
Regexp#=~ , maybe that is better?
hth,
harp
“Luca S.” [email protected] wrote in message
news:[email protected]…
p “NO”
–
because of this
irb(main):008:0> a=c.scan( /1234567890/ )
=> []
c.scan is returning an empty array, not nil, so your ‘if’ statement
passes.
I prefer to do a regex for what you seem to be trying to do.
if (c =~(/1234567890/ )) then
or if((index=c=~/23211/)) then
=~ returns nil for no match. Otherwise you get the index of the content.
Jared
http://jaredrichardson.net
Luca S. [email protected] wrote:
p “NO”
end
This always returns “OK” ![:frowning: :frowning:](https://www.ruby-forum.com/images/emoji/apple/frowning.png?v=12)
Any suggestions what goes wrong here. And is this the way to check the
content of a string ?
What exactly do you want to check? If you want to make sure that a
string
solely consists of digits this is what you would do:
c = “1234AA”
if /\A\d+\z/ =~ c
puts “ok”
else
puts “nok”
end
Kind regards
robert
Alle 22:21, domenica 19 novembre 2006, Luca S. ha scritto:
p “NO”
end
This always returns “OK” ![:frowning: :frowning:](/images/emoji/twitter/frowning.png?v=6)
Any suggestions what goes wrong here. And is this the way to check the
content of a string ?
Thanks a lot
LuCa
Even when there’s no match, String#scan returns an array, so your is
always
true. To make it work, you should use
if !c.scan(/1234567890/).empty?
As for your second question, it depends on what exactly you want to do.
It is
the correct form if you need to get all the numbers in the string,
regardless
of their position or any other thing (by the way, if you want to match a
digit in a regexp, you can use /\d/). If you simply want to check
whether the
string contains a digit, you can use String#match or =~ with the /\d/
regexp.
If you need more control on the scanning, you can use the StringScanner
class.
I hope this helps
Stefano
Bernard K. wrote:
this is a ruby gotcha
the only thing that returns false or false or nil
0 , ‘0’, ‘’’’, an empty array, or an empty hash all evaluate to true
Saying it’s a “gotcha” makes it sound like the behavior is wrong. Some
would say that only false should be false. Me, I like that nil is
false, but I sure as hell don’t want 0 or ‘’ or [] or {} to be false.
It behaves well – that’s not a gotcha – that’s just good common sense.
I can’t quite tell what you’re looking for exactly, but String#match is
probably it. (I don’t like the =~ perlism myself).
Hi –
On Mon, 20 Nov 2006, Robert K. wrote:
else
solely consists of digits this is what you would do:
c = “1234AA”
if /\A\d+\z/ =~ c
Or:
unless /\D/ =~ c
![:slight_smile: :slight_smile:](/images/emoji/twitter/slight_smile.png?v=6)
David
----- Original Message -----
From: “Jared R.” [email protected]
Newsgroups: comp.lang.ruby
To: “ruby-talk ML” [email protected]
Sent: Sunday, November 19, 2006 4:45 PM
Subject: Re: test content string with regex
if c.scan( /1234567890/ )
c.scan is returning an empty array, not nil, so your ‘if’ statement
Jared
http://jaredrichardson.net
the OP asked why it was always true
this is a ruby gotcha
the only thing that returns false or false or nil
0 , ‘0’, ‘’‘’, an empty array, or an empty hash all evaluate to true
Hi –
On Tue, 21 Nov 2006, El Gato wrote:
false, but I sure as hell don’t want 0 or ‘’ or [] or {} to be false.
It behaves well – that’s not a gotcha – that’s just good common sense.
I can’t quite tell what you’re looking for exactly, but String#match is
probably it. (I don’t like the =~ perlism myself).
I don’t either, but I’ve reluctantly had to accept that it’s faster
than #match, at least in the comparisons I’ve seen. Of course that
doesn’t matter unless it matters, so to speak.
David