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?
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?
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 
To work around this:
!!is_valid # !! is like the to boolean operator 
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).