From: Rob Sanheim Date: 2007-01-15T05:57:40+09:00 Subject: Re: checking if a string matches a regexp - am I missing something? On 1/13/07, William James wrote: > Rob Sanheim wrote: > > On 1/13/07, James Edward Gray II 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