Checking if a string matches a regexp - am I missing somethi

I figure that I must be missing something really obvious with this
question. But here goes:

I want to know if a string matches a regular expression. I don’t care
where the match begins, I don’t want a matchdata object, I don’t want
to check for nil, I just want a boolean indicating if a string matches
a regexp. And I want this to be one method call. From what I can
tell, this is the closest I can get:

reg = /\w/
reg === “string” # close, but I want to send the message to the
string, not the other way around
(“string” =~ reg) >= 0 # ugly
(“string” =~ reg) != 0 # still ugly
“string”.include? reg # this would seem to follow the ruby way, but it
throws a TypeError

If I’m not missing some other trick to do this, why doesn’t include?
just allow regexp’s like so many of the other (slice, index, scan,
etc) string methods?

  • Rob

On Sun, 14 Jan 2007, Rob S. wrote:

(“string” =~ reg) != 0 # still ugly
“string”.include? reg # this would seem to follow the ruby way, but it
throws a TypeError

What am I not understanding here?

“string” =~ reg

Kirk H.

On Jan 13, 2007, at 9:43 PM, Rob S. wrote:

I figure that I must be missing something really obvious with this
question. But here goes:

I want to know if a string matches a regular expression. I don’t care
where the match begins, I don’t want a matchdata object, I don’t want
to check for nil, I just want a boolean indicating if a string matches
a regexp. And I want this to be one method call. From what I can
tell, this is the closest I can get:

(“string” =~ reg) >= 0 # ugly

Just drop the noise:

“string” =~ reg # => int results are +true+ and nil is +false+

Hope that helps.

James Edward G. II

On 1/13/07, James Edward G. II [email protected] wrote:

(“string” =~ reg) >= 0 # ugly

Just drop the noise:

“string” =~ reg # => int results are +true+ and nil is +false+

Hope that helps.

True…but here is a cleaned up version of the place where I tried to do
that:

def valid_query?

query is a string accessor

if query_is_plain_text?
  is_valid = valid_query_length? && (query =~ regex)
else
  is_valid = query_is_url?
end
is_valid

end

So of course, when it was both a valid query and had a valid length,
it would return zero because it matched the start of the regexp. The
caller of the method wanted true or false only, not zero.

Rob S. wrote:

tell, this is the closest I can get:
True…but here is a cleaned up version of the place where I tried to do that:

So of course, when it was both a valid query and had a valid length,
it would return zero because it matched the start of the regexp. The
caller of the method wanted true or false only, not zero.

Who wrote a caller that wanted true or false only, and why?
What does the caller do when it receives 0?

irb(main):002:0> puts ‘yeah’ if true
yeah
=> nil
irb(main):003:0> puts ‘yeah’ if 0
yeah
=> nil
irb(main):004:0> puts ‘yeah’ if false
=> nil

If you actually have a caller written so mindlessly that it
only works with true or false:

!!(is_valid = valid_query_length? && (query =~ regex) )

On 1/13/07, William J. [email protected] wrote:

a regexp. And I want this to be one method call. From what I can

end
=> nil
irb(main):003:0> puts ‘yeah’ if 0
yeah
=> nil
irb(main):004:0> puts ‘yeah’ if false
=> nil

If you actually have a caller written so mindlessly that it
only works with true or false:

!!(is_valid = valid_query_length? && (query =~ regex) )

Well I guess I was mindless, then. =) I wrote a spec that was using
“should.be(true)” and “should.be(false)”, which is using assert_same
underneath, so of course it was failing if it returned 0. So the easy
solution is to use should.equal instead of should.be. Thanks for the
double !! tip, though.

Now, about allowing regexp’s for “include?” - doesn’t that fit well
with the humane interface of String?

  • Rob

On Sun, Jan 14, 2007 at 01:09:49PM +0900, Rob S. wrote:

tell, this is the closest I can get:
True…but here is a cleaned up version of the place where I tried to do
end

So of course, when it was both a valid query and had a valid length,
it would return zero because it matched the start of the regexp. The
caller of the method wanted true or false only, not zero.
The caller is poorly written then :slight_smile:
To work around this:

!!is_valid # !! is like the to boolean operator :wink:
end

William J. wrote:

!!(is_valid = valid_query_length? && (query =~ regex) )

Make that

 is_valid = !!(valid_query_length? && (query =~ regex) )

On 1/14/07, Rob S. [email protected] wrote:

to check for nil, I just want a boolean indicating if a string matches

is_valid

yeah
!!(is_valid = valid_query_length? && (query =~ regex) )

Well I guess I was mindless, then. =) I wrote a spec that was using
“should.be(true)” and “should.be(false)”, which is using assert_same
underneath, so of course it was failing if it returned 0. So the easy
solution is to use should.equal instead of should.be. Thanks for the
double !! tip, though.

Now, about allowing regexp’s for “include?” - doesn’t that fit well
with the humane interface of String?

If you are using RSpec, you can simply say:
“blah”.should =~ /ah/
or
“blah”.should_not =~ /z/

If you want “include? with a Regexp” behavior, you can do:
if some_string[/some pattern/]

On Jan 13, 2007, at 10:09 PM, Rob S. wrote:

to check for nil, I just want a boolean indicating if a string
Hope that helps.
is_valid = query_is_url?
end
is_valid
end

!!(query =~ regex)

James Edward G. II

On 1/14/07, Wilson B. [email protected] wrote:

where the match begins, I don’t want a matchdata object, I don’t want
Hope that helps.
end
irb(main):002:0> puts ‘yeah’ if true

If you are using RSpec, you can simply say:
“blah”.should =~ /ah/
or
“blah”.should_not =~ /z/

If you want “include? with a Regexp” behavior, you can do:
if some_string[/some pattern/]

Well the method under test (under spec?) wasn’t dealing with regex.
It was just using a regex to figure out if something was valid, and
then checking some other things and returning what I thought would be
true or false. So thats why I couldn’t use the should =~ methods, and
in the end really wanted should.equal (I’m using spec/unit, not
rspec).

  • rob

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs