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