On 1/14/07, Wilson Bilkovich <wilsonb / gmail.com> wrote:
> On 1/14/07, Rob Sanheim <rsanheim / gmail.com> wrote:
> > On 1/13/07, William James <w_a_x_man / yahoo.com> wrote:
> > > Rob Sanheim wrote:
> > > > On 1/13/07, James Edward Gray II <james / grayproductions.net> wrote:
> > > > > On Jan 13, 2007, at 9:43 PM, Rob Sanheim 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.
> > > > >
> > > >
> > > > 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.
> > >
> > > 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) )
> >
> > 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/]
>

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