From: "David A. Black" Date: 2008-05-09T09:35:08+09:00 Subject: Re: Doing an AND in regexp char class Hi -- On Fri, 9 May 2008, Joel VanderWerf wrote: > Todd Benson wrote: >> I'm drawing a blank here with this one. Why doesn't this work then... >> >> irb(main):006:0> r = /\A[oh]*\z/ >> => /\A[oh]*\z/ >> irb(main):007:0> s = "hello, there" >> => "hello, there" >> irb(main):008:0> r === s >> => false > > Maybe I'm confused about was wanted originally. The above tests the following > condition: > > (set of chars occurring in given string) > is_a_subset_of > (given set of chars). > > irb(main):007:0> /\A[oh]*\z/ === "hohoho" > => true > irb(main):008:0> /\A[oh]*\z/ === "ho ho" > => false > > If you want superset instead of subset, this works: > > irb(main):013:0> /(?=.*h)(?=.*o)/ === "h o" > => true That depends on the order, though. To do the superset test, you could just do the subset, but in the other direction: check that the character class, as a string, doesn't contain anything that isn't in the main string: str = "h o" chars = "ho" /\A[#{str}]*\z/ === chars # true (though probably best to uniquify the string first). David -- Rails training from David A. Black and Ruby Power and Light: INTRO TO RAILS June 9-12 Berlin ADVANCING WITH RAILS June 16-19 Berlin INTRO TO RAILS June 24-27 London (Skills Matter) See http://www.rubypal.com for details and updates!