From: Wilson Bilkovich Date: 2007-01-15T06:02:36+09:00 Subject: Re: checking if a string matches a regexp - am I missing something? On 1/14/07, Rob Sanheim wrote: > 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? 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/]