Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   checking if a string matches a regexp - am I missing something? (http://www.velocityreviews.com/forums/t837162-checking-if-a-string-matches-a-regexp-am-i-missing-something.html)

Rob Sanheim 01-14-2007 03:43 AM

checking if a string matches a regexp - am I missing something?
 
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


James Edward Gray II 01-14-2007 04:03 AM

Re: checking if a string matches a regexp - am I missing something?
 
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.

James Edward Gray II


khaines@enigo.com 01-14-2007 04:09 AM

Re: checking if a string matches a regexp - am I missing something?
 
On Sun, 14 Jan 2007, Rob Sanheim wrote:

> 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


What am I not understanding here?

"string" =~ reg


Kirk Haines



Rob Sanheim 01-14-2007 04:09 AM

Re: checking if a string matches a regexp - am I missing something?
 
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.


James Edward Gray II 01-14-2007 04:26 AM

Re: checking if a string matches a regexp - am I missing something?
 
On Jan 13, 2007, at 10:09 PM, 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


!!(query =~ regex)

James Edward Gray II


Logan Capaldo 01-14-2007 04:28 AM

Re: checking if a string matches a regexp - am I missing something?
 
On Sun, Jan 14, 2007 at 01:09:49PM +0900, 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.

The caller is poorly written then :)
To work around this:

!!is_valid # !! is like the to boolean operator ;)
end



William James 01-14-2007 04:31 AM

Re: checking if a string matches a regexp - am I missing something?
 
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) )


William James 01-14-2007 04:34 AM

Re: checking if a string matches a regexp - am I missing something?
 
William James wrote:

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


Make that

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


Rob Sanheim 01-14-2007 08:57 PM

Re: checking if a string matches a regexp - am I missing something?
 
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?

- Rob


Wilson Bilkovich 01-14-2007 09:02 PM

Re: checking if a string matches a regexp - am I missing something?
 
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/]



All times are GMT. The time now is 01:31 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.