From: Mike Cargal Date: 2010-11-05T08:40:04+09:00 Subject: Re: Regular Expression double grrrrr..... (I messed up the parentheses on the last last one) regex = /^(A(?!.*A)|B(?!.*B)|C(?!.*C)|D(?!.*D.*D)|DD(?!.*D))+$/ ["ABCDD","CA","CAD", "CADD","CADDD","DAD","DADD","DADAD","ADD", "BAC","BBAD","AABCCD", "DADD","DADBD","ABCDDA", "MIKE"].each do |string| puts "'#{string}' => #{string.match(regex)}" end On Nov 4, 2010, at 7:14 PM, Mike Cargal wrote: > grrr...... > > regex = /^(A(?!.*A)|B(?!.*B)|C(?!.*C)|D(?!.*D.*D|DD(?!.*D)))+$/ > > ["ABCDD","CA","CAD", > "CADD","CADDD","DAD","DADD","DADAD","ADD", > "BAC","BBAD","AABCCD", > "DADD","DADBD","ABCDDA", > "MIKE"].each do |string| > puts "'#{string}' => #{string.match(regex)}" > end > > ====================== > 'ABCDD' => ABCDD > 'CA' => CA > 'CAD' => CAD > 'CADD' => CADD > 'CADDD' => > 'DAD' => DAD > 'DADD' => > 'DADAD' => > 'ADD' => ADD > 'BAC' => BAC > 'BBAD' => > 'AABCCD' => > 'DADD' => > 'DADBD' => > 'ABCDDA' => > 'MIKE' => > ====================== > On Nov 4, 2010, at 7:06 PM, Kendall Gifford wrote: > >> On Thu, Nov 4, 2010 at 4:53 PM, Mike Cargal wrote: >>> >>> On Nov 4, 2010, at 1:34 PM, Kendall Gifford wrote: >>> >>>> On Thu, Nov 4, 2010 at 11:27 AM, Kendall Gifford wrote: >>>>> On Thu, Nov 4, 2010 at 5:46 AM, Mike Cargal wrote: >>>>>> regex = /^(A(?!A)|B(?!B)|C(?!C)|D{1,2}(?!D))+$/ >>>>>> >>>>>> ["ABCDD","CA","CAD","CADD","CADDD","DAD","BAC","BBAD","AABCCD"].each do |string| >>>>>> puts "'#{string}' => #{string.match(regex)}" >>>>>> end >>>>>> >>>>>> ============== >>>>>> 'ABCDD' => ABCDD >>>>>> 'CA' => CA >>>>>> 'CAD' => CAD >>>>>> 'CADD' => CADD >>>>>> 'CADDD' => >>>>>> 'DAD' => DAD >>>>>> 'BAC' => BAC >>>>>> 'BBAD' => >>>>>> 'AABCCD' => >>>>>> ============== >>>>> >>>>> However, this also appears by my test to match "DADD", "ABA", etc: >>>>> >>>>> ["ABA", "DADD", "CAC"].each do |string| >>>>> puts "'#{string}' => #{string.match(regex)}" >>>>> end >>>>> 'DADD' => DADD >>>>> 'ABA' => ABA >>>>> 'CAC' => CAC >>>>> >>>>> It does get you closer though. I rarely remember to make use of >>>>> look-ahead (and look-behind and other "(?X" style patterns) since when >>>>> switching languages/regexp engines, I'm never sure what features will >>>>> be there (and will still work the same). I guess I'm too conservative, >>>>> sticking with core/basic features. >>>>> >>>>> This does make me curious how short of a regex using these features >>>>> could be written for this one case... >>>>> >>>> >>>> Okay, now this is even closer: >>>> >>>> regex = /^(A(?=[^A]+$)|B(?=[^B]+$)|C(?=[^C]+$)|D{1,2}(?!D))+$/ >>>> >>>> However, it still has problems with "DADD", "DADBD" and such... >>>> >>>> -- >>>> Kendall Gifford >>>> zettabyte@gmail.com >>>> >>> >>> >>> Oh... missed that detail... I *think* this covers the bases... >>> >>> >>> regex = /^(A(?!.*A)|B(?!.*B)|C(?!.*C)|D{1,2}(?!.*D))+$/ >>> >>> ["ABCDD","CA","CAD", >>> "CADD","CADDD","DAD", >>> "BAC","BBAD","AABCCD", >>> "DADD","DADBD","ABCDDA", >>> "MIKE"].each do |string| >>> puts "'#{string}' => #{string.match(regex)}" >>> end >>> ==================== >>> 'ABCDD' => ABCDD >>> 'CA' => CA >>> 'CAD' => CAD >>> 'CADD' => CADD >>> 'CADDD' => >>> 'DAD' => >>> 'BAC' => BAC >>> 'BBAD' => >>> 'AABCCD' => >>> 'DADD' => >>> 'DADBD' => >>> 'ABCDDA' => >>> 'MIKE' => >>> ==================== >>> >>> Mike Cargal >>> >>> mike@cargal.net >>> http://blog.mikecargal.com >>> >> >> Except that "DAD" *is* legal according to OP's description. :-) >> >> -- >> Kendall Gifford >> zettabyte@gmail.com >> > > Mike Cargal > > mike@cargal.net > http://blog.mikecargal.com > > > > > Mike Cargal mike@cargal.net http://blog.mikecargal.com