On Sat, Jan 19, 2002 at 02:52:15PM +0000, Robin Houston wrote:
> Consider this subroutine:
> 
> sub shrinkable ($) {
>     my $str = shift;
>     for my $i (1..length($str)) {
>         return 1 if substr($str, $i) . substr($str, 0, $i) lt $str;
>     }
>     return 0;
> }
> 
> So "foo" is not shrinkable, "bar" is shrinkable and so on.
> Intuitively, a string is shrinkable iff it can be split into
> two pieces $A.$B so that ("$B$A" lt "$A$B"). "bar" is shrinkable
> because you can split it into b,ar and ("arb" lt "bar").
> 
> Can you write a regex which matches only shrinkable strings?
> No, you're not allowed to use embedded code constructs ;-)
> 
> You may find it easier to write a bit of code which constructs
> such a regex -- that's fine.
> 
> (I'll post my solution in a few days in the unlikely event that none
> of you has bettered it by then. It's a fun problem.)


The "shrinkable" strings will be in one of the two following forms:

     XbYXaZ,  with X, Y and Z (possible empty) strings of any length,
              and a and b strings of length 1, with a lt b.
     aXbYaX,  with X and Y (possible empty) strings of any length,
              and a and b strings of length 1, with a lt b.


We can easily generate all the possibilities and combine them in a
regex.


     #!/usr/bin/perl 

     use strict;
     use warnings qw /all/;

     my @strings;
     my $p;
     my $max = 255;  # Use a higher number for Unicode.
     foreach my $c (1 .. $max) {
         push @strings => sprintf '^(.*)\x%02x.*\%d[\x00-\x%02x].*$' =>
                                   $c, ++ $p, $c - 1;
         push @strings => sprintf '^([\x00-\x%02x].*)\x%02x.*\%d$' =>
                                   $c - 1, $c, ++ $p;
     }

     my $regex = join "|" => map {"(?:$_)"} @strings;

     $regex =~ s/\|/|\n /g;
     my $rgx =  "/$regex/sx";

     print $rgx, "\n";

     __END__


Running this gives us:

/(?:^(.*)\x01.*\1[\x00-\x00].*$)|
 (?:^([\x00-\x00].*)\x01.*\2$)|
 (?:^(.*)\x02.*\3[\x00-\x01].*$)|
 (?:^([\x00-\x01].*)\x02.*\4$)|
 (?:^(.*)\x03.*\5[\x00-\x02].*$)|
 (?:^([\x00-\x02].*)\x03.*\6$)|
 (?:^(.*)\x04.*\7[\x00-\x03].*$)|
 (?:^([\x00-\x03].*)\x04.*\8$)|
 (?:^(.*)\x05.*\9[\x00-\x04].*$)|
 (?:^([\x00-\x04].*)\x05.*\10$)|
 (?:^(.*)\x06.*\11[\x00-\x05].*$)|
 (?:^([\x00-\x05].*)\x06.*\12$)|
 (?:^(.*)\x07.*\13[\x00-\x06].*$)|
 (?:^([\x00-\x06].*)\x07.*\14$)|
 (?:^(.*)\x08.*\15[\x00-\x07].*$)|
 (?:^([\x00-\x07].*)\x08.*\16$)|
 (?:^(.*)\x09.*\17[\x00-\x08].*$)|
 (?:^([\x00-\x08].*)\x09.*\18$)|
 (?:^(.*)\x0a.*\19[\x00-\x09].*$)|
 (?:^([\x00-\x09].*)\x0a.*\20$)|
 (?:^(.*)\x0b.*\21[\x00-\x0a].*$)|
 (?:^([\x00-\x0a].*)\x0b.*\22$)|
 (?:^(.*)\x0c.*\23[\x00-\x0b].*$)|
 (?:^([\x00-\x0b].*)\x0c.*\24$)|
 (?:^(.*)\x0d.*\25[\x00-\x0c].*$)|
 (?:^([\x00-\x0c].*)\x0d.*\26$)|
 (?:^(.*)\x0e.*\27[\x00-\x0d].*$)|
 (?:^([\x00-\x0d].*)\x0e.*\28$)|
 (?:^(.*)\x0f.*\29[\x00-\x0e].*$)|
 (?:^([\x00-\x0e].*)\x0f.*\30$)|
 (?:^(.*)\x10.*\31[\x00-\x0f].*$)|
 (?:^([\x00-\x0f].*)\x10.*\32$)|
 (?:^(.*)\x11.*\33[\x00-\x10].*$)|
 (?:^([\x00-\x10].*)\x11.*\34$)|
 (?:^(.*)\x12.*\35[\x00-\x11].*$)|
 (?:^([\x00-\x11].*)\x12.*\36$)|
 (?:^(.*)\x13.*\37[\x00-\x12].*$)|
 (?:^([\x00-\x12].*)\x13.*\38$)|
 (?:^(.*)\x14.*\39[\x00-\x13].*$)|
 (?:^([\x00-\x13].*)\x14.*\40$)|
 (?:^(.*)\x15.*\41[\x00-\x14].*$)|
 (?:^([\x00-\x14].*)\x15.*\42$)|
 (?:^(.*)\x16.*\43[\x00-\x15].*$)|
 (?:^([\x00-\x15].*)\x16.*\44$)|
 (?:^(.*)\x17.*\45[\x00-\x16].*$)|
 (?:^([\x00-\x16].*)\x17.*\46$)|
 (?:^(.*)\x18.*\47[\x00-\x17].*$)|
 (?:^([\x00-\x17].*)\x18.*\48$)|
 (?:^(.*)\x19.*\49[\x00-\x18].*$)|
 (?:^([\x00-\x18].*)\x19.*\50$)|
 (?:^(.*)\x1a.*\51[\x00-\x19].*$)|
 (?:^([\x00-\x19].*)\x1a.*\52$)|
 (?:^(.*)\x1b.*\53[\x00-\x1a].*$)|
 (?:^([\x00-\x1a].*)\x1b.*\54$)|
 (?:^(.*)\x1c.*\55[\x00-\x1b].*$)|
 (?:^([\x00-\x1b].*)\x1c.*\56$)|
 (?:^(.*)\x1d.*\57[\x00-\x1c].*$)|
 (?:^([\x00-\x1c].*)\x1d.*\58$)|
 (?:^(.*)\x1e.*\59[\x00-\x1d].*$)|
 (?:^([\x00-\x1d].*)\x1e.*\60$)|
 (?:^(.*)\x1f.*\61[\x00-\x1e].*$)|
 (?:^([\x00-\x1e].*)\x1f.*\62$)|
 (?:^(.*)\x20.*\63[\x00-\x1f].*$)|
 (?:^([\x00-\x1f].*)\x20.*\64$)|
 (?:^(.*)\x21.*\65[\x00-\x20].*$)|
 (?:^([\x00-\x20].*)\x21.*\66$)|
 (?:^(.*)\x22.*\67[\x00-\x21].*$)|
 (?:^([\x00-\x21].*)\x22.*\68$)|
 (?:^(.*)\x23.*\69[\x00-\x22].*$)|
 (?:^([\x00-\x22].*)\x23.*\70$)|
 (?:^(.*)\x24.*\71[\x00-\x23].*$)|
 (?:^([\x00-\x23].*)\x24.*\72$)|
 (?:^(.*)\x25.*\73[\x00-\x24].*$)|
 (?:^([\x00-\x24].*)\x25.*\74$)|
 (?:^(.*)\x26.*\75[\x00-\x25].*$)|
 (?:^([\x00-\x25].*)\x26.*\76$)|
 (?:^(.*)\x27.*\77[\x00-\x26].*$)|
 (?:^([\x00-\x26].*)\x27.*\78$)|
 (?:^(.*)\x28.*\79[\x00-\x27].*$)|
 (?:^([\x00-\x27].*)\x28.*\80$)|
 (?:^(.*)\x29.*\81[\x00-\x28].*$)|
 (?:^([\x00-\x28].*)\x29.*\82$)|
 (?:^(.*)\x2a.*\83[\x00-\x29].*$)|
 (?:^([\x00-\x29].*)\x2a.*\84$)|
 (?:^(.*)\x2b.*\85[\x00-\x2a].*$)|
 (?:^([\x00-\x2a].*)\x2b.*\86$)|
 (?:^(.*)\x2c.*\87[\x00-\x2b].*$)|
 (?:^([\x00-\x2b].*)\x2c.*\88$)|
 (?:^(.*)\x2d.*\89[\x00-\x2c].*$)|
 (?:^([\x00-\x2c].*)\x2d.*\90$)|
 (?:^(.*)\x2e.*\91[\x00-\x2d].*$)|
 (?:^([\x00-\x2d].*)\x2e.*\92$)|
 (?:^(.*)\x2f.*\93[\x00-\x2e].*$)|
 (?:^([\x00-\x2e].*)\x2f.*\94$)|
 (?:^(.*)\x30.*\95[\x00-\x2f].*$)|
 (?:^([\x00-\x2f].*)\x30.*\96$)|
 (?:^(.*)\x31.*\97[\x00-\x30].*$)|
 (?:^([\x00-\x30].*)\x31.*\98$)|
 (?:^(.*)\x32.*\99[\x00-\x31].*$)|
 (?:^([\x00-\x31].*)\x32.*\100$)|
 (?:^(.*)\x33.*\101[\x00-\x32].*$)|
 (?:^([\x00-\x32].*)\x33.*\102$)|
 (?:^(.*)\x34.*\103[\x00-\x33].*$)|
 (?:^([\x00-\x33].*)\x34.*\104$)|
 (?:^(.*)\x35.*\105[\x00-\x34].*$)|
 (?:^([\x00-\x34].*)\x35.*\106$)|
 (?:^(.*)\x36.*\107[\x00-\x35].*$)|
 (?:^([\x00-\x35].*)\x36.*\108$)|
 (?:^(.*)\x37.*\109[\x00-\x36].*$)|
 (?:^([\x00-\x36].*)\x37.*\110$)|
 (?:^(.*)\x38.*\111[\x00-\x37].*$)|
 (?:^([\x00-\x37].*)\x38.*\112$)|
 (?:^(.*)\x39.*\113[\x00-\x38].*$)|
 (?:^([\x00-\x38].*)\x39.*\114$)|
 (?:^(.*)\x3a.*\115[\x00-\x39].*$)|
 (?:^([\x00-\x39].*)\x3a.*\116$)|
 (?:^(.*)\x3b.*\117[\x00-\x3a].*$)|
 (?:^([\x00-\x3a].*)\x3b.*\118$)|
 (?:^(.*)\x3c.*\119[\x00-\x3b].*$)|
 (?:^([\x00-\x3b].*)\x3c.*\120$)|
 (?:^(.*)\x3d.*\121[\x00-\x3c].*$)|
 (?:^([\x00-\x3c].*)\x3d.*\122$)|
 (?:^(.*)\x3e.*\123[\x00-\x3d].*$)|
 (?:^([\x00-\x3d].*)\x3e.*\124$)|
 (?:^(.*)\x3f.*\125[\x00-\x3e].*$)|
 (?:^([\x00-\x3e].*)\x3f.*\126$)|
 (?:^(.*)\x40.*\127[\x00-\x3f].*$)|
 (?:^([\x00-\x3f].*)\x40.*\128$)|
 (?:^(.*)\x41.*\129[\x00-\x40].*$)|
 (?:^([\x00-\x40].*)\x41.*\130$)|
 (?:^(.*)\x42.*\131[\x00-\x41].*$)|
 (?:^([\x00-\x41].*)\x42.*\132$)|
 (?:^(.*)\x43.*\133[\x00-\x42].*$)|
 (?:^([\x00-\x42].*)\x43.*\134$)|
 (?:^(.*)\x44.*\135[\x00-\x43].*$)|
 (?:^([\x00-\x43].*)\x44.*\136$)|
 (?:^(.*)\x45.*\137[\x00-\x44].*$)|
 (?:^([\x00-\x44].*)\x45.*\138$)|
 (?:^(.*)\x46.*\139[\x00-\x45].*$)|
 (?:^([\x00-\x45].*)\x46.*\140$)|
 (?:^(.*)\x47.*\141[\x00-\x46].*$)|
 (?:^([\x00-\x46].*)\x47.*\142$)|
 (?:^(.*)\x48.*\143[\x00-\x47].*$)|
 (?:^([\x00-\x47].*)\x48.*\144$)|
 (?:^(.*)\x49.*\145[\x00-\x48].*$)|
 (?:^([\x00-\x48].*)\x49.*\146$)|
 (?:^(.*)\x4a.*\147[\x00-\x49].*$)|
 (?:^([\x00-\x49].*)\x4a.*\148$)|
 (?:^(.*)\x4b.*\149[\x00-\x4a].*$)|
 (?:^([\x00-\x4a].*)\x4b.*\150$)|
 (?:^(.*)\x4c.*\151[\x00-\x4b].*$)|
 (?:^([\x00-\x4b].*)\x4c.*\152$)|
 (?:^(.*)\x4d.*\153[\x00-\x4c].*$)|
 (?:^([\x00-\x4c].*)\x4d.*\154$)|
 (?:^(.*)\x4e.*\155[\x00-\x4d].*$)|
 (?:^([\x00-\x4d].*)\x4e.*\156$)|
 (?:^(.*)\x4f.*\157[\x00-\x4e].*$)|
 (?:^([\x00-\x4e].*)\x4f.*\158$)|
 (?:^(.*)\x50.*\159[\x00-\x4f].*$)|
 (?:^([\x00-\x4f].*)\x50.*\160$)|
 (?:^(.*)\x51.*\161[\x00-\x50].*$)|
 (?:^([\x00-\x50].*)\x51.*\162$)|
 (?:^(.*)\x52.*\163[\x00-\x51].*$)|
 (?:^([\x00-\x51].*)\x52.*\164$)|
 (?:^(.*)\x53.*\165[\x00-\x52].*$)|
 (?:^([\x00-\x52].*)\x53.*\166$)|
 (?:^(.*)\x54.*\167[\x00-\x53].*$)|
 (?:^([\x00-\x53].*)\x54.*\168$)|
 (?:^(.*)\x55.*\169[\x00-\x54].*$)|
 (?:^([\x00-\x54].*)\x55.*\170$)|
 (?:^(.*)\x56.*\171[\x00-\x55].*$)|
 (?:^([\x00-\x55].*)\x56.*\172$)|
 (?:^(.*)\x57.*\173[\x00-\x56].*$)|
 (?:^([\x00-\x56].*)\x57.*\174$)|
 (?:^(.*)\x58.*\175[\x00-\x57].*$)|
 (?:^([\x00-\x57].*)\x58.*\176$)|
 (?:^(.*)\x59.*\177[\x00-\x58].*$)|
 (?:^([\x00-\x58].*)\x59.*\178$)|
 (?:^(.*)\x5a.*\179[\x00-\x59].*$)|
 (?:^([\x00-\x59].*)\x5a.*\180$)|
 (?:^(.*)\x5b.*\181[\x00-\x5a].*$)|
 (?:^([\x00-\x5a].*)\x5b.*\182$)|
 (?:^(.*)\x5c.*\183[\x00-\x5b].*$)|
 (?:^([\x00-\x5b].*)\x5c.*\184$)|
 (?:^(.*)\x5d.*\185[\x00-\x5c].*$)|
 (?:^([\x00-\x5c].*)\x5d.*\186$)|
 (?:^(.*)\x5e.*\187[\x00-\x5d].*$)|
 (?:^([\x00-\x5d].*)\x5e.*\188$)|
 (?:^(.*)\x5f.*\189[\x00-\x5e].*$)|
 (?:^([\x00-\x5e].*)\x5f.*\190$)|
 (?:^(.*)\x60.*\191[\x00-\x5f].*$)|
 (?:^([\x00-\x5f].*)\x60.*\192$)|
 (?:^(.*)\x61.*\193[\x00-\x60].*$)|
 (?:^([\x00-\x60].*)\x61.*\194$)|
 (?:^(.*)\x62.*\195[\x00-\x61].*$)|
 (?:^([\x00-\x61].*)\x62.*\196$)|
 (?:^(.*)\x63.*\197[\x00-\x62].*$)|
 (?:^([\x00-\x62].*)\x63.*\198$)|
 (?:^(.*)\x64.*\199[\x00-\x63].*$)|
 (?:^([\x00-\x63].*)\x64.*\200$)|
 (?:^(.*)\x65.*\201[\x00-\x64].*$)|
 (?:^([\x00-\x64].*)\x65.*\202$)|
 (?:^(.*)\x66.*\203[\x00-\x65].*$)|
 (?:^([\x00-\x65].*)\x66.*\204$)|
 (?:^(.*)\x67.*\205[\x00-\x66].*$)|
 (?:^([\x00-\x66].*)\x67.*\206$)|
 (?:^(.*)\x68.*\207[\x00-\x67].*$)|
 (?:^([\x00-\x67].*)\x68.*\208$)|
 (?:^(.*)\x69.*\209[\x00-\x68].*$)|
 (?:^([\x00-\x68].*)\x69.*\210$)|
 (?:^(.*)\x6a.*\211[\x00-\x69].*$)|
 (?:^([\x00-\x69].*)\x6a.*\212$)|
 (?:^(.*)\x6b.*\213[\x00-\x6a].*$)|
 (?:^([\x00-\x6a].*)\x6b.*\214$)|
 (?:^(.*)\x6c.*\215[\x00-\x6b].*$)|
 (?:^([\x00-\x6b].*)\x6c.*\216$)|
 (?:^(.*)\x6d.*\217[\x00-\x6c].*$)|
 (?:^([\x00-\x6c].*)\x6d.*\218$)|
 (?:^(.*)\x6e.*\219[\x00-\x6d].*$)|
 (?:^([\x00-\x6d].*)\x6e.*\220$)|
 (?:^(.*)\x6f.*\221[\x00-\x6e].*$)|
 (?:^([\x00-\x6e].*)\x6f.*\222$)|
 (?:^(.*)\x70.*\223[\x00-\x6f].*$)|
 (?:^([\x00-\x6f].*)\x70.*\224$)|
 (?:^(.*)\x71.*\225[\x00-\x70].*$)|
 (?:^([\x00-\x70].*)\x71.*\226$)|
 (?:^(.*)\x72.*\227[\x00-\x71].*$)|
 (?:^([\x00-\x71].*)\x72.*\228$)|
 (?:^(.*)\x73.*\229[\x00-\x72].*$)|
 (?:^([\x00-\x72].*)\x73.*\230$)|
 (?:^(.*)\x74.*\231[\x00-\x73].*$)|
 (?:^([\x00-\x73].*)\x74.*\232$)|
 (?:^(.*)\x75.*\233[\x00-\x74].*$)|
 (?:^([\x00-\x74].*)\x75.*\234$)|
 (?:^(.*)\x76.*\235[\x00-\x75].*$)|
 (?:^([\x00-\x75].*)\x76.*\236$)|
 (?:^(.*)\x77.*\237[\x00-\x76].*$)|
 (?:^([\x00-\x76].*)\x77.*\238$)|
 (?:^(.*)\x78.*\239[\x00-\x77].*$)|
 (?:^([\x00-\x77].*)\x78.*\240$)|
 (?:^(.*)\x79.*\241[\x00-\x78].*$)|
 (?:^([\x00-\x78].*)\x79.*\242$)|
 (?:^(.*)\x7a.*\243[\x00-\x79].*$)|
 (?:^([\x00-\x79].*)\x7a.*\244$)|
 (?:^(.*)\x7b.*\245[\x00-\x7a].*$)|
 (?:^([\x00-\x7a].*)\x7b.*\246$)|
 (?:^(.*)\x7c.*\247[\x00-\x7b].*$)|
 (?:^([\x00-\x7b].*)\x7c.*\248$)|
 (?:^(.*)\x7d.*\249[\x00-\x7c].*$)|
 (?:^([\x00-\x7c].*)\x7d.*\250$)|
 (?:^(.*)\x7e.*\251[\x00-\x7d].*$)|
 (?:^([\x00-\x7d].*)\x7e.*\252$)|
 (?:^(.*)\x7f.*\253[\x00-\x7e].*$)|
 (?:^([\x00-\x7e].*)\x7f.*\254$)|
 (?:^(.*)\x80.*\255[\x00-\x7f].*$)|
 (?:^([\x00-\x7f].*)\x80.*\256$)|
 (?:^(.*)\x81.*\257[\x00-\x80].*$)|
 (?:^([\x00-\x80].*)\x81.*\258$)|
 (?:^(.*)\x82.*\259[\x00-\x81].*$)|
 (?:^([\x00-\x81].*)\x82.*\260$)|
 (?:^(.*)\x83.*\261[\x00-\x82].*$)|
 (?:^([\x00-\x82].*)\x83.*\262$)|
 (?:^(.*)\x84.*\263[\x00-\x83].*$)|
 (?:^([\x00-\x83].*)\x84.*\264$)|
 (?:^(.*)\x85.*\265[\x00-\x84].*$)|
 (?:^([\x00-\x84].*)\x85.*\266$)|
 (?:^(.*)\x86.*\267[\x00-\x85].*$)|
 (?:^([\x00-\x85].*)\x86.*\268$)|
 (?:^(.*)\x87.*\269[\x00-\x86].*$)|
 (?:^([\x00-\x86].*)\x87.*\270$)|
 (?:^(.*)\x88.*\271[\x00-\x87].*$)|
 (?:^([\x00-\x87].*)\x88.*\272$)|
 (?:^(.*)\x89.*\273[\x00-\x88].*$)|
 (?:^([\x00-\x88].*)\x89.*\274$)|
 (?:^(.*)\x8a.*\275[\x00-\x89].*$)|
 (?:^([\x00-\x89].*)\x8a.*\276$)|
 (?:^(.*)\x8b.*\277[\x00-\x8a].*$)|
 (?:^([\x00-\x8a].*)\x8b.*\278$)|
 (?:^(.*)\x8c.*\279[\x00-\x8b].*$)|
 (?:^([\x00-\x8b].*)\x8c.*\280$)|
 (?:^(.*)\x8d.*\281[\x00-\x8c].*$)|
 (?:^([\x00-\x8c].*)\x8d.*\282$)|
 (?:^(.*)\x8e.*\283[\x00-\x8d].*$)|
 (?:^([\x00-\x8d].*)\x8e.*\284$)|
 (?:^(.*)\x8f.*\285[\x00-\x8e].*$)|
 (?:^([\x00-\x8e].*)\x8f.*\286$)|
 (?:^(.*)\x90.*\287[\x00-\x8f].*$)|
 (?:^([\x00-\x8f].*)\x90.*\288$)|
 (?:^(.*)\x91.*\289[\x00-\x90].*$)|
 (?:^([\x00-\x90].*)\x91.*\290$)|
 (?:^(.*)\x92.*\291[\x00-\x91].*$)|
 (?:^([\x00-\x91].*)\x92.*\292$)|
 (?:^(.*)\x93.*\293[\x00-\x92].*$)|
 (?:^([\x00-\x92].*)\x93.*\294$)|
 (?:^(.*)\x94.*\295[\x00-\x93].*$)|
 (?:^([\x00-\x93].*)\x94.*\296$)|
 (?:^(.*)\x95.*\297[\x00-\x94].*$)|
 (?:^([\x00-\x94].*)\x95.*\298$)|
 (?:^(.*)\x96.*\299[\x00-\x95].*$)|
 (?:^([\x00-\x95].*)\x96.*\300$)|
 (?:^(.*)\x97.*\301[\x00-\x96].*$)|
 (?:^([\x00-\x96].*)\x97.*\302$)|
 (?:^(.*)\x98.*\303[\x00-\x97].*$)|
 (?:^([\x00-\x97].*)\x98.*\304$)|
 (?:^(.*)\x99.*\305[\x00-\x98].*$)|
 (?:^([\x00-\x98].*)\x99.*\306$)|
 (?:^(.*)\x9a.*\307[\x00-\x99].*$)|
 (?:^([\x00-\x99].*)\x9a.*\308$)|
 (?:^(.*)\x9b.*\309[\x00-\x9a].*$)|
 (?:^([\x00-\x9a].*)\x9b.*\310$)|
 (?:^(.*)\x9c.*\311[\x00-\x9b].*$)|
 (?:^([\x00-\x9b].*)\x9c.*\312$)|
 (?:^(.*)\x9d.*\313[\x00-\x9c].*$)|
 (?:^([\x00-\x9c].*)\x9d.*\314$)|
 (?:^(.*)\x9e.*\315[\x00-\x9d].*$)|
 (?:^([\x00-\x9d].*)\x9e.*\316$)|
 (?:^(.*)\x9f.*\317[\x00-\x9e].*$)|
 (?:^([\x00-\x9e].*)\x9f.*\318$)|
 (?:^(.*)\xa0.*\319[\x00-\x9f].*$)|
 (?:^([\x00-\x9f].*)\xa0.*\320$)|
 (?:^(.*)\xa1.*\321[\x00-\xa0].*$)|
 (?:^([\x00-\xa0].*)\xa1.*\322$)|
 (?:^(.*)\xa2.*\323[\x00-\xa1].*$)|
 (?:^([\x00-\xa1].*)\xa2.*\324$)|
 (?:^(.*)\xa3.*\325[\x00-\xa2].*$)|
 (?:^([\x00-\xa2].*)\xa3.*\326$)|
 (?:^(.*)\xa4.*\327[\x00-\xa3].*$)|
 (?:^([\x00-\xa3].*)\xa4.*\328$)|
 (?:^(.*)\xa5.*\329[\x00-\xa4].*$)|
 (?:^([\x00-\xa4].*)\xa5.*\330$)|
 (?:^(.*)\xa6.*\331[\x00-\xa5].*$)|
 (?:^([\x00-\xa5].*)\xa6.*\332$)|
 (?:^(.*)\xa7.*\333[\x00-\xa6].*$)|
 (?:^([\x00-\xa6].*)\xa7.*\334$)|
 (?:^(.*)\xa8.*\335[\x00-\xa7].*$)|
 (?:^([\x00-\xa7].*)\xa8.*\336$)|
 (?:^(.*)\xa9.*\337[\x00-\xa8].*$)|
 (?:^([\x00-\xa8].*)\xa9.*\338$)|
 (?:^(.*)\xaa.*\339[\x00-\xa9].*$)|
 (?:^([\x00-\xa9].*)\xaa.*\340$)|
 (?:^(.*)\xab.*\341[\x00-\xaa].*$)|
 (?:^([\x00-\xaa].*)\xab.*\342$)|
 (?:^(.*)\xac.*\343[\x00-\xab].*$)|
 (?:^([\x00-\xab].*)\xac.*\344$)|
 (?:^(.*)\xad.*\345[\x00-\xac].*$)|
 (?:^([\x00-\xac].*)\xad.*\346$)|
 (?:^(.*)\xae.*\347[\x00-\xad].*$)|
 (?:^([\x00-\xad].*)\xae.*\348$)|
 (?:^(.*)\xaf.*\349[\x00-\xae].*$)|
 (?:^([\x00-\xae].*)\xaf.*\350$)|
 (?:^(.*)\xb0.*\351[\x00-\xaf].*$)|
 (?:^([\x00-\xaf].*)\xb0.*\352$)|
 (?:^(.*)\xb1.*\353[\x00-\xb0].*$)|
 (?:^([\x00-\xb0].*)\xb1.*\354$)|
 (?:^(.*)\xb2.*\355[\x00-\xb1].*$)|
 (?:^([\x00-\xb1].*)\xb2.*\356$)|
 (?:^(.*)\xb3.*\357[\x00-\xb2].*$)|
 (?:^([\x00-\xb2].*)\xb3.*\358$)|
 (?:^(.*)\xb4.*\359[\x00-\xb3].*$)|
 (?:^([\x00-\xb3].*)\xb4.*\360$)|
 (?:^(.*)\xb5.*\361[\x00-\xb4].*$)|
 (?:^([\x00-\xb4].*)\xb5.*\362$)|
 (?:^(.*)\xb6.*\363[\x00-\xb5].*$)|
 (?:^([\x00-\xb5].*)\xb6.*\364$)|
 (?:^(.*)\xb7.*\365[\x00-\xb6].*$)|
 (?:^([\x00-\xb6].*)\xb7.*\366$)|
 (?:^(.*)\xb8.*\367[\x00-\xb7].*$)|
 (?:^([\x00-\xb7].*)\xb8.*\368$)|
 (?:^(.*)\xb9.*\369[\x00-\xb8].*$)|
 (?:^([\x00-\xb8].*)\xb9.*\370$)|
 (?:^(.*)\xba.*\371[\x00-\xb9].*$)|
 (?:^([\x00-\xb9].*)\xba.*\372$)|
 (?:^(.*)\xbb.*\373[\x00-\xba].*$)|
 (?:^([\x00-\xba].*)\xbb.*\374$)|
 (?:^(.*)\xbc.*\375[\x00-\xbb].*$)|
 (?:^([\x00-\xbb].*)\xbc.*\376$)|
 (?:^(.*)\xbd.*\377[\x00-\xbc].*$)|
 (?:^([\x00-\xbc].*)\xbd.*\378$)|
 (?:^(.*)\xbe.*\379[\x00-\xbd].*$)|
 (?:^([\x00-\xbd].*)\xbe.*\380$)|
 (?:^(.*)\xbf.*\381[\x00-\xbe].*$)|
 (?:^([\x00-\xbe].*)\xbf.*\382$)|
 (?:^(.*)\xc0.*\383[\x00-\xbf].*$)|
 (?:^([\x00-\xbf].*)\xc0.*\384$)|
 (?:^(.*)\xc1.*\385[\x00-\xc0].*$)|
 (?:^([\x00-\xc0].*)\xc1.*\386$)|
 (?:^(.*)\xc2.*\387[\x00-\xc1].*$)|
 (?:^([\x00-\xc1].*)\xc2.*\388$)|
 (?:^(.*)\xc3.*\389[\x00-\xc2].*$)|
 (?:^([\x00-\xc2].*)\xc3.*\390$)|
 (?:^(.*)\xc4.*\391[\x00-\xc3].*$)|
 (?:^([\x00-\xc3].*)\xc4.*\392$)|
 (?:^(.*)\xc5.*\393[\x00-\xc4].*$)|
 (?:^([\x00-\xc4].*)\xc5.*\394$)|
 (?:^(.*)\xc6.*\395[\x00-\xc5].*$)|
 (?:^([\x00-\xc5].*)\xc6.*\396$)|
 (?:^(.*)\xc7.*\397[\x00-\xc6].*$)|
 (?:^([\x00-\xc6].*)\xc7.*\398$)|
 (?:^(.*)\xc8.*\399[\x00-\xc7].*$)|
 (?:^([\x00-\xc7].*)\xc8.*\400$)|
 (?:^(.*)\xc9.*\401[\x00-\xc8].*$)|
 (?:^([\x00-\xc8].*)\xc9.*\402$)|
 (?:^(.*)\xca.*\403[\x00-\xc9].*$)|
 (?:^([\x00-\xc9].*)\xca.*\404$)|
 (?:^(.*)\xcb.*\405[\x00-\xca].*$)|
 (?:^([\x00-\xca].*)\xcb.*\406$)|
 (?:^(.*)\xcc.*\407[\x00-\xcb].*$)|
 (?:^([\x00-\xcb].*)\xcc.*\408$)|
 (?:^(.*)\xcd.*\409[\x00-\xcc].*$)|
 (?:^([\x00-\xcc].*)\xcd.*\410$)|
 (?:^(.*)\xce.*\411[\x00-\xcd].*$)|
 (?:^([\x00-\xcd].*)\xce.*\412$)|
 (?:^(.*)\xcf.*\413[\x00-\xce].*$)|
 (?:^([\x00-\xce].*)\xcf.*\414$)|
 (?:^(.*)\xd0.*\415[\x00-\xcf].*$)|
 (?:^([\x00-\xcf].*)\xd0.*\416$)|
 (?:^(.*)\xd1.*\417[\x00-\xd0].*$)|
 (?:^([\x00-\xd0].*)\xd1.*\418$)|
 (?:^(.*)\xd2.*\419[\x00-\xd1].*$)|
 (?:^([\x00-\xd1].*)\xd2.*\420$)|
 (?:^(.*)\xd3.*\421[\x00-\xd2].*$)|
 (?:^([\x00-\xd2].*)\xd3.*\422$)|
 (?:^(.*)\xd4.*\423[\x00-\xd3].*$)|
 (?:^([\x00-\xd3].*)\xd4.*\424$)|
 (?:^(.*)\xd5.*\425[\x00-\xd4].*$)|
 (?:^([\x00-\xd4].*)\xd5.*\426$)|
 (?:^(.*)\xd6.*\427[\x00-\xd5].*$)|
 (?:^([\x00-\xd5].*)\xd6.*\428$)|
 (?:^(.*)\xd7.*\429[\x00-\xd6].*$)|
 (?:^([\x00-\xd6].*)\xd7.*\430$)|
 (?:^(.*)\xd8.*\431[\x00-\xd7].*$)|
 (?:^([\x00-\xd7].*)\xd8.*\432$)|
 (?:^(.*)\xd9.*\433[\x00-\xd8].*$)|
 (?:^([\x00-\xd8].*)\xd9.*\434$)|
 (?:^(.*)\xda.*\435[\x00-\xd9].*$)|
 (?:^([\x00-\xd9].*)\xda.*\436$)|
 (?:^(.*)\xdb.*\437[\x00-\xda].*$)|
 (?:^([\x00-\xda].*)\xdb.*\438$)|
 (?:^(.*)\xdc.*\439[\x00-\xdb].*$)|
 (?:^([\x00-\xdb].*)\xdc.*\440$)|
 (?:^(.*)\xdd.*\441[\x00-\xdc].*$)|
 (?:^([\x00-\xdc].*)\xdd.*\442$)|
 (?:^(.*)\xde.*\443[\x00-\xdd].*$)|
 (?:^([\x00-\xdd].*)\xde.*\444$)|
 (?:^(.*)\xdf.*\445[\x00-\xde].*$)|
 (?:^([\x00-\xde].*)\xdf.*\446$)|
 (?:^(.*)\xe0.*\447[\x00-\xdf].*$)|
 (?:^([\x00-\xdf].*)\xe0.*\448$)|
 (?:^(.*)\xe1.*\449[\x00-\xe0].*$)|
 (?:^([\x00-\xe0].*)\xe1.*\450$)|
 (?:^(.*)\xe2.*\451[\x00-\xe1].*$)|
 (?:^([\x00-\xe1].*)\xe2.*\452$)|
 (?:^(.*)\xe3.*\453[\x00-\xe2].*$)|
 (?:^([\x00-\xe2].*)\xe3.*\454$)|
 (?:^(.*)\xe4.*\455[\x00-\xe3].*$)|
 (?:^([\x00-\xe3].*)\xe4.*\456$)|
 (?:^(.*)\xe5.*\457[\x00-\xe4].*$)|
 (?:^([\x00-\xe4].*)\xe5.*\458$)|
 (?:^(.*)\xe6.*\459[\x00-\xe5].*$)|
 (?:^([\x00-\xe5].*)\xe6.*\460$)|
 (?:^(.*)\xe7.*\461[\x00-\xe6].*$)|
 (?:^([\x00-\xe6].*)\xe7.*\462$)|
 (?:^(.*)\xe8.*\463[\x00-\xe7].*$)|
 (?:^([\x00-\xe7].*)\xe8.*\464$)|
 (?:^(.*)\xe9.*\465[\x00-\xe8].*$)|
 (?:^([\x00-\xe8].*)\xe9.*\466$)|
 (?:^(.*)\xea.*\467[\x00-\xe9].*$)|
 (?:^([\x00-\xe9].*)\xea.*\468$)|
 (?:^(.*)\xeb.*\469[\x00-\xea].*$)|
 (?:^([\x00-\xea].*)\xeb.*\470$)|
 (?:^(.*)\xec.*\471[\x00-\xeb].*$)|
 (?:^([\x00-\xeb].*)\xec.*\472$)|
 (?:^(.*)\xed.*\473[\x00-\xec].*$)|
 (?:^([\x00-\xec].*)\xed.*\474$)|
 (?:^(.*)\xee.*\475[\x00-\xed].*$)|
 (?:^([\x00-\xed].*)\xee.*\476$)|
 (?:^(.*)\xef.*\477[\x00-\xee].*$)|
 (?:^([\x00-\xee].*)\xef.*\478$)|
 (?:^(.*)\xf0.*\479[\x00-\xef].*$)|
 (?:^([\x00-\xef].*)\xf0.*\480$)|
 (?:^(.*)\xf1.*\481[\x00-\xf0].*$)|
 (?:^([\x00-\xf0].*)\xf1.*\482$)|
 (?:^(.*)\xf2.*\483[\x00-\xf1].*$)|
 (?:^([\x00-\xf1].*)\xf2.*\484$)|
 (?:^(.*)\xf3.*\485[\x00-\xf2].*$)|
 (?:^([\x00-\xf2].*)\xf3.*\486$)|
 (?:^(.*)\xf4.*\487[\x00-\xf3].*$)|
 (?:^([\x00-\xf3].*)\xf4.*\488$)|
 (?:^(.*)\xf5.*\489[\x00-\xf4].*$)|
 (?:^([\x00-\xf4].*)\xf5.*\490$)|
 (?:^(.*)\xf6.*\491[\x00-\xf5].*$)|
 (?:^([\x00-\xf5].*)\xf6.*\492$)|
 (?:^(.*)\xf7.*\493[\x00-\xf6].*$)|
 (?:^([\x00-\xf6].*)\xf7.*\494$)|
 (?:^(.*)\xf8.*\495[\x00-\xf7].*$)|
 (?:^([\x00-\xf7].*)\xf8.*\496$)|
 (?:^(.*)\xf9.*\497[\x00-\xf8].*$)|
 (?:^([\x00-\xf8].*)\xf9.*\498$)|
 (?:^(.*)\xfa.*\499[\x00-\xf9].*$)|
 (?:^([\x00-\xf9].*)\xfa.*\500$)|
 (?:^(.*)\xfb.*\501[\x00-\xfa].*$)|
 (?:^([\x00-\xfa].*)\xfb.*\502$)|
 (?:^(.*)\xfc.*\503[\x00-\xfb].*$)|
 (?:^([\x00-\xfb].*)\xfc.*\504$)|
 (?:^(.*)\xfd.*\505[\x00-\xfc].*$)|
 (?:^([\x00-\xfc].*)\xfd.*\506$)|
 (?:^(.*)\xfe.*\507[\x00-\xfd].*$)|
 (?:^([\x00-\xfd].*)\xfe.*\508$)|
 (?:^(.*)\xff.*\509[\x00-\xfe].*$)|
 (?:^([\x00-\xfe].*)\xff.*\510$)/sx


We could factor out the ^ and $ and save a few bytes in the resulting
regex, but that's left as an exercise to the reader.


Abigail

Reply via email to