test content string with regex

L

Luca Scaljery

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" :(

Any suggestions what goes wrong here. And is this the way to check the
content of a string ?

Thanks a lot
LuCa
 
S

Stefano Crocco

Alle 22:21, domenica 19 novembre 2006, Luca Scaljery ha scritto:
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" :(

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
 
R

Robert Klemme

Luca Scaljery said:
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" :(

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
 
S

Shai Rosenfeld

Luca said:
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" :(

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
 
B

Bernard Kenik

----- Original Message -----
From: "Jared Richardson" <[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

Luca Scaljery said:
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" :(

Any suggestions what goes wrong here. And is this the way to check the
content of a string ?

Thanks a lot
LuCa

--

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




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
 
E

El Gato

Bernard said:
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).
 
D

dblack

Hi --

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

Or:

unless /\D/ =~ c

:)


David

--
David A. Black | (e-mail address removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org
 
D

dblack

Hi --

Bernard said:
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).

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

--
David A. Black | (e-mail address removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,219
Messages
2,571,117
Members
47,729
Latest member
taulaju99

Latest Threads

Top