The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Regexp-Compare.t'

use strict;

use Regexp::Compare qw(is_less_or_equal);

our @leq;
our @nc;
our @invalid;
our $i;

BEGIN {
    @leq = (
	    '' => '', '|||' => '', '' => '|||', 'a' => '', 'a' => '(?:b|)a',
 	    'aa' => 'a', 'abc' => 'bc', 'abc' => 'ab', 'abcd' => 'bc',
	    '[a]' => 'a', 'a' => '[a]', 'ab' => '[ab]', '[a]' => '[ab]',
 	    'a' => '[^b]', 'a' => '.', '[a]' => '.', '[a][b]' => 'ab',
	    'ab' => '[a][b]', 'a|b' => '[ab]', 'a' => 'a|b', 'a|a' => 'a',
	    'a' => 'a|a', 'ab[c]' => 'abc', '.' => '[^\\n]', '[^\\n]' => '.',
	    '.' => '[\\w\\W]', '.' => '[\\d\\D]', '[\\w\\W]' => '[\\W\\w]',
	    '[\\d\\D]' => '[\\W\\w]', '[\\W\\w]' => '[\\d\\D]',
	    'a' => '[^\\s]', '\\w\\s' => '\\s', '(?a:\\w\\s)' => '\\s',
	    '(?a:\\s)' => '\\s', '(?a:\\w\\d)' => '\\d',
	    '(?a:\\W\\d)' => '\\d',
	    '(?a:\\w\\s)' => '(?a:\\s)', '\\w(?a:\\s)' => '(?a:\\s)',
	    '(?a:\\W\\s)' => '(?a:\\s)', '\\W(?a:\\s)' => '(?a:\\s)',
	    '[^\\s]' => '(?s:.)', '[^\\S]' => '(?s:.)', 
	    '(?s:.)a' => 'a', '\\Da' => '\\w',
	    '\\Da' => '(?a:\\w)', '\\D-' => '(?a:\\W)',
	    '(?a:\\D-)' => '(?a:\\W)', '(?a:\\W)' => '(?s:.)',
	    '(?a:\\S)' => '(?s:.)', '(?a:\\D-)' => '(?a:\\S)',
	    '(?:\\D-)' => '(?a:\\S)', 'a|b' => '(?a:\\w)',
	    '(?a:a(?a:b))' => 'ab', 'ab' => '(?a:a(?a:b))',
            '\\h' => '(?s:.)', '\\H\\h' => '\\h', '[^\\h]' => '\\H',
            '\\v' => '(?s:.)', '\\V\\v' => '\\v', '[^\\v]' => '\\V',
            '\\w\\v' => '\\v', '(?a:\\w\\v)' => '\\v',
            '\\W\\v' => '\\v', '(?a:\\W\\v)' => '\\v',
            '\\s\\v' => '\\v', '(?a:\\s\\v)' => '\\v',
            '\\S\\v' => '\\v', '(?a:\\S\\v)' => '\\v',
            '\\d\\v' => '\\v', '(?a:\\d\\v)' => '\\v',
            '\\D\\v' => '\\v', '(?a:\\D\\v)' => '\\v',
            '(?a:\\w\\h)' => '\\h',
            '\\W\\h' => '\\h', '(?a:\\W\\h)' => '\\h',
            '\\s\\h' => '\\h', '(?a:\\s\\h)' => '\\h',
            '\\S\\h' => '\\h', '(?a:\\S\\h)' => '\\h',
            '\\d\\h' => '\\h', '(?a:\\d\\h)' => '\\h',
            '\\D\\h' => '\\h', '(?a:\\D\\h)' => '\\h',
	    'a[^\\n]' => 'a(?s:.)', 'a[^b]' => '(?s:a.)', 'ac' => 'a(?:b|)c',
	    '(?i:a(b|)c)' => '(?i:a(?:b|)c)',
	    '[ab]' => 'a|b', '[a-c]' => 'a|b|c', 'a|b' => 'b|a',
	    'a' => 'a?', 'aa' => 'a?', '\\\\\\\\' => '\\\\',
	    '\\\\' => '\\W', '_' => '\\w', ',|;' => '(?a:\\W)',
	    'a' => 'a{1,2}', 'a' => 'a*', 'aa' => 'a*', 'aaa' => 'a*',
	    '' => 'a*', '\\h|\\d' => '\\d|\\h', '\\d|\\h' => '\\h|\\d',
	    '(?i:a|a)' => '(?i:a)',
	    'b\\d' => 'a*b\\d', 'ac' => 'ab*c', 'a{1,2}' => 'a*',
	    'a' => 'a+', 'aa' => 'a+', 'a?' => 'a{0,1}',
	    'a{0,1}' => 'a?', 'aa' => 'a{2}', 'a{2}' => 'aa',
	    'ab{2}c' => 'abbc', 'abbc' => 'ab{2}c',
	    'a{1,}' => 'a', 'a' => 'a{1,}', 'xay' => 'xa{1,}y',
	    'a{2,}' => '(?i:a)', '(?i:-a)' => '(?a:\\W\\w)',
	    'a{1,}?b' => '(?i:a)',
	    'a{1,}' => 'a+', 'a+' => 'a{1,}', 'a{2,3}' => 'a+', 'ab+' => 'a.',
	    'aa{0,}' => 'a{1,}', 'a{1,}' => 'aa{0,}', 'aa{0,}' => 'a+',
	    'a+' => 'aa{0,}', 'aa*' => 'a{1,}', 'a{1,}' => 'aa*',
	    'a{3,}' => '(?a:\\S)', 'a{3,}' => 'a{2,}',
	    '\\v{3,}' => '\\v', '(?:abc){3,}' => '(?:abc){2,}',
	    'aa' => '(?s:.){2}', '(?i:aa)' => '(?s:.){2}',
	    'a(?i:a)' => '(?s:.){2}', 'a{,1}' => 'a\\W{2}\\d\\W',
	    'a+' => 'aa*', 'aa*' => 'a+', '[aA]' => '(?i:a)',
	    '(?i:a)' => '[aA]', '(?i:a)' => '[\\w]', '(?i:a)' => '\\V',
	    '\\Wa' => '\\w',
	    '(?a:\\Wa)' => '\\w', '\\Wa' => '(?a:\\w)', '\\Wa' => '(?a:\\S)',
	    '(?a:\\Wa)' => '(?a:\\S)', '(?a:\\Wa)' => '(?a:\\w)',
	    '\\W ' => '\\s', '(?a:\\W )' => '\\s', '\\s-' => '(?a:\\S)',
	    '(?a:\\s-)' => '(?a:\\S)', '\\S-' => '(?a:\\S)',
	    '\\d-' => '(?a:\\S)', '(?a:\\d)' => '(?a:\\S)',
	    '\\S=' => '(?a:\\D)', '(?a:\\S=)' => '(?a:\\D)',
	    'a(?:bcd)+' => 'a(?i:bcd)', 'ab+c' => 'ab+.',
	    'ab(?:cd)+' => '(?:ab)+cd', '(?:ab)+cd' => 'ab(?:cd)+',
	    'a{1,}' => '\\w', '(?:^a){1,}' => '^a', '(?m:^a)' => 'a',
	    '(?im:^a)' => '(?i:a)', '(?is:^a)' => '(?i:a)',
	    '(?:^a){1,}' => '(?a:^\\w)', '!(?a:\\w)' => '!.',
	    '(?a:\\w)' => '\\w', 'a*' => 'a{0,}', 'a{0,}' => 'a*',
	    'a+b' => 'ab', 'ab+' => 'ab{0,}', 'ab+' => 'a+b',
	    '(?i:a+b)' => '(?i:a)',
	    'ab+c' => 'ab{1,}c', 'ab{1}c' => 'abc',
	    'ab{1}c' => 'ad*bc', 'abc' => '(?:abc){1,2}', 'abc' => 'ab+c',
	    '(?i:abcd)' => '(?i:bc)', 'abcdefghi' => 'bcd',
	    'b{2,3}' => 'bb', 'b{3,3}' => 'bbb', 'bbb' => 'b{3,3}',
	    'b{3,3}' => 'b{3}', 'b{3}' => 'b{3,3}', 'a{1,}b' => 'ab',
	    '1{1,}a' => '(?a:\\d)a', '(?a:\\W{1,})' => '(?a:\\W|\\W)',
	    'ab+c' => 'ab*c', 'aaa' => 'a+', 'ab' => 'a+b', 'aaab' => 'a+b',
	    '^a+a' => '^aa', 'ab' => '(?:ab)*', 'ab' => 'a*b',
	    '^\\h' => '\\h', '(?m:^\\h)' => '\\h', '(?s:^\\h)' => '\\h',
	    'a*' => 'a*|b*', 'a*b' => '.', 'a*-' => '\\W',
	    'a*-' => '(?a:\\D)', '.\\h' => '\\h', '(?s:.\\h)' => '\\h',
	    '-* ' => '\\h', '-*a' => 'a', '(?i:-*a)' => '(?i:a)',
	    '-*a' => '(?a:\\w)', '-* ' => '(?a:\\s)', '-+ ' => '(?a:\\s)',
	    '-*a' => '(?a:\\S)', '-*1' => '(?a:\\d)', '1233*' => '123*',
	    '.+' => '.', '\\d+' => '\\d', '\\v+' => '\\v',
	    '-+' => '(?a:\\W)', '-+' => '(?a:\\S)',
	    '\\s-' => '\\W-', '(?a:\\s-)' => '\\W-', '\\s-' => '(?a:\\W-)', 
	    '(?a:\\s-)' => '(?a:\\W-)', '\\h-' => '\\s-',
	    '[0-9]' => '\\d', '[23]' => '\\d', '[23]' => '(?a:\\w)',
	    '4' => '\\d', '[0-9]' => '(?a:\\d)', '\\w1' => '(?a:\\d)',
	    '(?a:\\w1)' => '(?a:\\d)', '\\W1' => '(?a:\\d)',
	    '(?a:\\W1)' => '(?a:\\d)',
	    '0' => '\\w', '\\d' => '\\w', '(?a:\\D\\d)' => '\\w',
	    '\\s' => '\\D', 'a\\d' => 'a\\W?\\d', '(?a:\\d)' => '(?a:\\w)',
	    '(?a:\\d)' => '\\W?\\d',
	    '\\d' => '.', '[ \\t]' => '\\s', '[ \\t]' => '(?a:\\s)',
	    '[\\t ]' => '[^\\S]', '[\\t ]' => '(?a:\\D)',
	    ' ' => '\\s', '\\w' => '[^\\s]', '\\W' => '[^a]',
	    '(?a:\\W)' => '(?a:\\D)', '(?i:a )' => '\h',
	    'a' => '\\S', '[a]' => '\\S', '\\S' => '.',
	    '(?a:\\S\\S)' => '..', '\\S\\S' => '\\S',
	    '\\S' => '[^\\s]', '[^\\s]' => '\\S', '\\S\\s' => '\\s',
	    '(?a:\\S\\s)' => '(?a:\\s)', '\\b(?a:\\s)' => '\\s',
	    '\\b-' => '(?a:\\W)',
	    '(?i:a)' => '[aA]', '[aA]' => '(?i:a)', '(?i: )' => ' ',
	    '(?i:a)' => '(?i:a)', '(?i:a)' => '(?i:A)', '(?i:A)' => '(?i:a)',
	    '(?i:a)' => '\\w', '(?i:a)' => '(?a:\\w)', '(?i:0)' => '\\d',
	    '(?a:^\\s)' => '(?a:\\s)', '(?i:a)a' => 'a',
	    '(?as:^\\s)' => '(?sa:\\s)', '(?am:^\\s)' => '(?ma:\\s)', 
	    'c\\d' => '\\d', 'a[bc]d' => '[bc]', '\\s.' => '.',
	    '(?a:.\\d)' => '(?a:\\d)', '(?as:.\\d)' => '(?a:\\d)',
	    '.\\s' => '.', '.\\s' => '\\s', '\\d\\s' => '\\s',
	    '(?a:\\d\\s)' => '(?a:\\s)', '\\d(?a:\\s)' => '(?a:\\s)',
	    '(?a:\\D\\s)' => '(?a:\\s)', '\\D(?a:\\s)' => '(?a:\\s)',
	    '\\d\\S' => '\\S', '(?a:\\d\\s)' => '\\s', '. ' => '(?a:\\s)',
	    '. ' => '(?a:\\D)', '(?i:. )' => '(?a:\\D)',
	    '(?s:. )' => '(?a:\\D)', '\\s' => '(?a:\\D)',
	    '(?a:\\d\\S)' => '\\S', '(?a:\\D\\s)' => '\\s',
	    '.(?a:\\W)' => '(?a:\\W)', '(?s:.(?a:\\W))' => '(?as:\\W)',
	    '\\d\\s' => '\\w\\s', '\\s ' => ' ', '(?a:\\s )' => ' ',
	    '(?a:\\S )' => ' ', '\\w ' => ' ', '\\W ' => ' ',
	    '(?a:\\w )' => ' ', '(?a:\\W )' => ' ', '\\H\t' => '\t',
	    '(?a:\\d)a' => 'a', '(?a:\\D)a' => 'a',
	    '\\wa' => '(?i:a)', '(?a:\\wa)' => '(?i:a)',
	    '(?a:\\WA)' => '(?i:a)', '\\sa' => '(?i:A)',
	    '(?a:\\Sa)' => '(?i:A)', '\\da' => '(?i:a)',
	    '(?a:\\da)' => '(?i:a)', '(?a:\\Da)' => '(?i:a)',
	    '\\va' => '(?i:a)', '\\Wa' => '(?i:a)',
	    '\\V\t' => '\t', 'a' => '[\\S]', '\\H[aA]' => '(?i:a)',
	    '\\s' => '[\\s]', '[\\s]' => '\\s', '\\S' => '[\\S]',
	    '[\\S]' => '\\S', '[^\\S]' => '\\s', '\\s' => '[^\\S]',
	    '\\sab' => '\\wb', '\\s\\d' => '\\d', '(?a:\\s\\d)' => '\\d',
	    '(?a:\\s\\d)' => '\\w', '\\sa' => '(?a:\\w)',
	    '\\s(?a:\\d)' => '(?a:\\d)', '\\s(?a:\\s\\d)' => '(?a:\\d)',
	    '\\h\\d' => '\\d', '(?a:\\h\\d)' => '(?a:\\d)',
	    '(?a:\\H\\d)' => '(?a:\\d)',
	    '(?a:\\S\\d)' => '\\w', '(?a:\\S\\d)' => '\\d',
	    '(?a:\\S\\d)' => '(?a:\\d)', '\\S(?a:\\d)' => '(?a:\\d)',
	    '\\Va' => '(?a:\\w)', '\\Va' => '(?a:\\S)', '\\D1' => '\\d',
	    '(?a:\\D1)' => '\\d', '\\D1' => '(?a:\\d)',
	    '(?i:\\D1)' => '(?a:\\d)',
	    '(?a:\\D1)' => '(?a:\\d)', '(?a:\\D1)' => '(?a:\\D)1',
	    '(?a:\\D)1' => '(?a:\\D1)',
	    '\\S(?a:\\d)' => '(?a:\\w)', '(?a:\\S\\d)' => '(?a:\\w)',
	    '\\w' => '[\\w]', '[\\w]' => '\\w', '\\S\\d' => '\\H\\d',
	    '\\H\\d' => '\\d', '\\w-' => '\\W', '\\w-' => '(?a:\\W)',
	    '\\w-' => '(?a:\\D)', '(?a:\\w-)' => '(?a:\\D)',
	    '(?a:\\w-)' => '(?a:\\W)', '(?a:\\H\\d)' => '(?a:\\S)',
	    'a\\W' => 'a(?a:\\W)', '\\H-' => '\\W', '\\v' => '(?a:\\W)',
	    '\\H-' => '(?a:\\D)', '\\h-' => '(?a:\\D)',
	    '\\V-' => '\\W', '\\va' => '\\Wa', '\\v ' => ' ',
	    '\d' => '\H', 'a[\\v]b' => 'a[\\D]b', '(?a:\\H.)' => '(?a:.)',
	    'a[\\v]b' => 'a[\\W]b', '\\v' => '[^[:xdigit:]]',
	    '[[:xdigit:]]' => '\\V', '[[:lower:]]' => '[^\\v]',
	    '[[:upper:]]' => '\\V', '(?a:\\S-)' => '\\W',
	    '\\S-' => '\\H-', '\\B-' => '\\W', '\\B-' => '(?a:\\W)',
	    '\\v\\d' => '\\d', '(?a:\\v\\d)' => '(?a:\\d)',
	    '(?a:\\V\\d)' => '(?a:\\d)', '(?a:\\v )' => '(?a:\\s)',
	    '(?a:\\V )' => '(?a:\\s)', '(?a:\\h )' => '(?a:\\s)',
	    '(?a:\\H )' => '(?a:\\s)', ' |\\t' => '\\h',
	    '( |\\t)' => ' |\\t', ' |\\t' => '( |\\t)',
	    '[^\\W]' => '\\w', '[^\\W]' => '\\w', '[^\\w]' => '\\W',
	    '\\W' => '[^\\w]', '[^\\d]' => '\\D', '\\D' => '[^\\d]',
	    '\\W' => '[\\W]', '[\\W]' => '\\W', '\\d' => '[\\d]',
	    '[\\d]' => '\\d', '(?i:-)' => '-', '[\\da]' => '[a\\d]',
	    '[a\\d]' => '[\\da]', '\\B(?a:\\s)' => '(?a:\\s)',
	    '\\d' => '\\w', '(?i:a)' => '\\w', '\\d' => '\\w',
	    '\\D' => '[^0-9]', '(?a:\\D)' => '[^0-9]', '\\D' => '[^0]',
	    '(?a:\\W)' => '[^0]', '\\W' => '\\D', '\\d' => '[^\\D]',
	    '[^\\D]' => '\\d', '(?a:\\S-)' => '[^0]',
	    '[0-9]' => '\\d', '[0-9a-zA-Z_]' => '\\w',
	    '[0-9a-zA-Z_]' => '(?a:\\S)', '\\w(?a:\\S)' => '(?a:\\S)',
	    '(?i:ab)' => '..', '\\w\\d-' => '\\w-', '(?a:\\w\\d-)' => '\\W',
	    '\\W+' => '\\D', '^\\w+a' => '^\\w\\w', 'abc' => '\\w+',
	    '\\Aa' => '^a', '\\Aa' => '^a', 'a$' => '(?m:a$)',
	    '(?m:\\Aa)' => '^a', 'a\\Z' => 'a$', 'a$' => 'a\\Z',
	    '(?m:a\\Z)' => 'a$', 'a$' => '(?m:a\\Z)',
	    '(?m:a\\Z)' => 'ab*', 'a\Z' => 'ab*',
	    'ab$' => 'ab+', 'a\z' => 'a\Z',
	    '(?i:abc)' => '\\w+', '(?i:abc)' => '[aA][bB][cC]',
	    '(?:0+|1)' => '\\d+', '\t+| ' => '(?a:\\s)',
            '(?i:\t+| )' => '(?a:\\s)', '[^/]*' => '[^/\\\\]*',
            '^/[^/]*' => '^/[^/\\\\]*', '[^a]*' => '[^a-c]*', 
	    '.' => '(?s:.)', '^a' => 'a', '^.a' => 'a', '^.a' => '(?i:a)',
	    '(?s:^a)' => '^a',
	    '(?s:^a)' => '(?a:\\w)', '.a' => '(?a:\\w)', '.a' => '(?a:\\S)',
	    '.a' => 'a', '^a' => '(?s:^a)', '^a' => '(?m:^a)', '^ ' => '\\s',
	    '^ ' => '(?a:\\D)', '(?m:^ )' => '(?a:\\D)',
	    '(?s:^ )' => '(?a:\\D)',
	    '^-' => '(?a:\\S)', '(?m:^-)' => '(?a:\\S)',
	    '(?s:^-)' => '(?a:\\S)', '^1' => '(?a:\\d)', 
	    '(?s:^1)' => '(?a:\\d)', '(?m:^1)' => '(?a:\\d)',
	    '(?a:\\d)' => '\\d',
	    '(?a:^\\W)' => '(?a:\\W)', '(?am:^\\W)' => '(?am:\\W)',
	    '(?as:^\\W)' => '(?as:\\W)',
	    '\\na' => '(?m:^a)', '(?m:[\\n]a)' => '(?m:^a)',
	    '(?m:\\n[a])' => '(?m:^a)', '(?m:\\n\\n[a])' => '(?m:^a)',
	    'a\\nb' => '(?m:^b)', '.\\nb' => '(?m:^b)',
	    '(?i:a\\n)' => '(?im:a$)',
	    '\\d\\na' => '(?m:^a)', '(?a:\\d\\na)' => '(?m:^a)',
	    '(?a:\\D\\n1)' => '(?m:^1)', '(?s:\\D.)' => '(?s:.)',
	    '(?as:\\D.)' => '(?as:.)', '(?i:a\\nb)' => '(?im:^b)',
	    '[a-z]\\nb' => '(?m:^b)', '\\s\\nb' => '(?m:^b)',
	    '\\w\\nb' => '(?m:^b)', '(?a:\\w\\nb)' => '(?m:^b)',
	    '(?a:\\W\\nb)' => '(?m:^b)', '(?a:\\s\\nb)' => '(?m:^b)',
	    '(?a:\\S\\nb)' => '(?m:^b)',
	    'a$' => 'a', 'a$' => 'a$', '\\h\\nb' => '\\s\\nb',
	    '\\H\\nb' => '(?m:^b)', '\\S\\nb' => '\\H\\nb',
	    '\\v\\nb' => '(?m:^b)', '(?m:^\d)' => '\d',
	    '(?am:^\d)' => '(?a:\w)', '(?a:(\\t ))' => '(?a:\\s)\\s',
	    '(?i:(?s:.)a)' => '(?i:a)',
	    'aa$' => 'a$', '(?:abc)+$' => 'abc$', 'a$' => 'a(?:b|)',
	    'a$' => 'a(?:b|)$', 'a[\\n]' => '(?m:a$)',
	    '(?a:a(b|)\W)' => '(?a:a(?:b|)\W)',
	    '(?a: (\t|)\S)' => '(?a: (?:\t|)\S)',
	    '(?i:a[\\n])' => '(?mi:a$)', 'a$' => 'a*', '.[aA]' => '(?i:a)',
            '(?m:\\H$)' => '(?m:\\H$)', '(?s:\\V$)' => '(?s:a*$)',
            '(?s:\\v$)' => '(?s:a*$)', '(?as:\\D$)' => '(?s:1*$)',
            '(?sa:\\d$)' => '(?s:a*$)', '(?as:\\s$)' => '(?s:a*$)',
            '(?as:\\S$)' => '(?s:a*$)',
            '(?m:\\V$)' => '(?m:a*$)', '(?m:\\v$)' => '(?m:a*$)',
	    '(?m:\\S$)' => '(?m:a*$)', '(?s:\\S$)' => '(?s:a*$)', 
	    '(?s:\\s$)' => '(?s:\\t*$)', '(?s:\\w$)' => '(?s:a*$)', 
	    '(?s:\\W$)' => '(?s:@*$)', '(?s:\\d$)' => '(?s:@*$)',
	    '(?s:\\D$)' => '(?s:a*$)', '(?m:\\d$)' => '(?m:1?$)',
	    '(?am:\\w$)' => '(?m:a*$)', '(?am:\\W$)' => '(?m:\\?*$)',
	    '(?am:\d$)' => '(?m:1*$)', '(?ma:\D$)' => '(?m:a*$)',
	    '(?ms:.){2}' => '(?sm:.){2}', '(?sm:.){2}' => '(?ms:.){2}',
	    '^$' => '^$', '\\b\\s' => '\\s', '\\B\\s' => '\\s',
	    '^a' => '\\b', '\\w!' => '\\b', '(?a:\\w!)' => '\\b',
	    'a!' => '\\b', '(?i:a!)' => '\\b', 'a\\d!' => 'a\\b',
	    '\\b\\t' => '(?a:\\D)', '(?a:a\\d)!' => 'a\\b',
	    'a$' => '\\b', '\\b\\h' => '\\h', '\\b\\H' => '(?s:.)',
	    '\\Wa' => '\\b', '(?a:\\Wa)' => '\\b', '\\sa' => '\\b',
	    '(?a:\\sa)' => '\\sa', '\\ha' => '\b',
	    '\\va' => '\\b', '[^\\V]a' => '\\b', '(?a:\\Sa )' => '\\b',
	    '\\Sa ' => '\\Ha ', '\\Ha ' => '\\b', '\\ba' => 'a',
	    '\\ba' => '(?a:\\w)', 'a\\b' => 'a', '(?s:.\\s)a' => '\\s\\w',
	    '(?s:.\\s)a' => '\\s(?a:\\w)', '\\b1' => '(?a:\\d)',
	    '(?s:. )a' => '(?a:\\s)\\w', '\\ba' => '(?i:a)',
	    '\\ba' => '(?a:\\S)', '(?as:.-)' => '(?a:\\S)',
	    '^[a-c]' => '\\b\\w', '[a-z]-' => '\\b-', '[+-]\\d' => '\\b',
	    '\\B1' => '(?a:\\d)', '\\B\\h' => '\\h',
	    '-$' => '\\B', '^-' => '\\B', '^-$' => '\\B', 'a\\d' => '\\B',
	    '(?:a\\d){2}' => '\\B', '\\Ba' => 'a', '\\Ba' => '(?a:\\w)',
	    '\Ba' => '(?i:a)',
	    '\\B(?i:a)' => '(?a:\\S)', '\\B\\t' => '(?a:\\D)',
	    '\\Ba' => '(?a:\\S)', '\\Baa' => 'a{1,2}',
	    '\\Baaaa' => '(?:aa){2}', '1(?:aa){2}' => '\\Baaaa',
	    '1(?i:aa){2}' => '(?i:\\Baaaa)',
	    '(?:\\S\\S){2}-' => '\\S\\S\\S',
	    '(?:\\V\\V){2}-' => '\\V\\V\\V',
	    '(?:\\h\\h){2}-' => '\\h\\h\\h',
	    '(?:\\d\\d){2}-' => '\\d\\d\\d\\d',
	    '(?a:\\d\\d){2}-' => '(?a:\\d\\d\\d\\d)',
	    '(?a:(\\D\\D){2})' => '(?a:\\D\\D\\D\\D)',
	    '(?a:\\w\\w){2}-' => '(?a:\\w\\w\\w\\w)',
	    '(?a:\\W\\W){2}' => '(?a:\\W\\W\\W\\W)',
	    '(?a:(\\W\\W)){2}' => '(?a:\\W\\W){2}',
	    '(?a:\\W\\W){2}' => '(?a:(\\W\\W)){2}',
	    '(?a:\\v\\v){2}-' => '(?a:\\v\\v\\v\\v)',
	    '\\s ' => '\\B', '(?a:\\s )' => '\\B',
	    '(?a:\\wa)' => '\\B', '\\h ' => '\\s ',
	    '\\da' => '\\B', '(?a:\\da)' => '\\B', '(?ai:\\D)aa' => '\\B',
	    '\\Hab' => '\\B', '\\Sab' => '\\Hab', '(?a:\\Sab)' => '\\B',
	    '\\H.' => '.', '\\v ' => '\\B ', '\W!a' => '\B',
	    '(?a:\W!a)' => '\B', '(?:(?:a|b)|(?:c|d))' => '[a-d]',
	    '[a-d]' => '(?:(?:a|b)|(?:c|d))', '(?:a[b])+' => '\\w*',
	    '(?:a|b)(?:c|d)' => '[ab][cd]', '(?:a|)' => '(?:|a)',
	    '(?:a|)' => 'a?', 'a?' => '(?:a|)', 'a(?:a|)' => 'a(?:|a)',
	    'a(?:b|)' => 'a(?:|c)', '(?:a|)c' => '(?:b|)c',
	    '\\0' => '.', 'a\\0\\b' => '(?i:a\\0\\b)', 'a' => 'a(?:b)?',
	    'a(?:b+)?cd' => 'a(?:b+)?c', '(?:a|b)?' => '(?:a|b)?',
	    '(?:ab|cd)+' => '\\w', '[[:digit:]]' => '\\d',
	    '\\d' => '[[:digit:]]', '[[:digit:][:alpha:]]' => '[[:alnum:]]',
	    '[[:alnum:]]' => '[[:digit:][:alpha:]]',
	    '[^[:digit:][:alpha:]]' => '[^[:alnum:]]',
	    '[[:digit:][:alpha:]]' => '[[:alpha:][:digit:]]',
	    '[[:alpha:][:digit:]]' => '[[:digit:][:alpha:]]',
	    '[[:lower:]]' => '[[:alpha:]]', '[[:upper:]]' => '[[:alpha:]]',
	    '[0-9a-f]' => '[[:xdigit:]]', '[[:digit:]]' => '[[:xdigit:]]',
	    '[\\w\\-_.]+\\.' => '[-\\w_.]+\\.',
	    '(?i:a(?:b\\s)?\\b)' => '(?i:a(?:b\\s)?\\b)', 'abc' => '(?:|.)',
	    '(?:[\\w\\-_.]+\\.)?' => '(?:[-\\w\\_.]+[.])?',
	    '(?:abc){1,2}' => '\\w', '(?:(?:abc){1,2})+' => '\\w+',
	    '(?:(?:abc){1,2}){4}' => '\\w+', '(?:(?:   ){1,2})+' => '(?a:\s)',
	    '(?:(?i:abc){1,2})+' => '(?i:b)',
	    '(?:(?:   ){1,2})+' => '\\h',
	    '(?:(?:abc){1,2})+' => '\\H',
	    '(?:(?:\\t\\t\\t){1,2})+' => '(?a:\\D)',
	    '(?:(?:---){1,2})+' => '(?a:\\S)',
	    '(?:ab){2}(?:cd){1}' => '\\w*',
	    '(?:ab{5}){1,}' => '(?:ab{4}){1,2}',
	    '(?:(?:(?:(?:\\d){1,3})\\.){5}){1,2}' => '(?:(?:(?:(?:\\d){1,3})\\.){4}){1,2}',
	    '(?:(?:(?:(?:\\d){1,3})\\.){5}){1,2}' => '(?:(?:(?:(?:\\d){1,3})\\.){4}){1,}',
	    '(?:(?:(?:(?:\\d){1,3})\\.){5}){1,}' => '(?:(?:(?:(?:\\d){1,3})\\.){4}){1,2}',
	    '(?:(?:(?:(?:\\d){1,3})\\.){5}){3,}' => '(?:(?:(?:(?:\\d){1,3})\\.){4}){1,2}',
	    '(?:(?:(?:(?:d){1,3})\\.){5}){1,2}' => '(?:(?:(?:(?:d){1,3})\\.){4}){1,2}',
	    '(?:(?:(?:(?:d){1,3})\\.){5}){1,2}' => '(?:(?:(?:(?:d){1,3})\\.){4}){1,}',
	    '(?:(?:(?:(?:d){1,3})\\.){5}){1,}' => '(?:(?:(?:(?:d){1,3})\\.){4}){1,2}',
	    '(?:(?:(?:(?:d){1,3})\\.){5}){3,}' => '(?:(?:(?:(?:d){1,3})\\.){4}){1,2}',
	    '0[1-9]|[1-4][0-9]|5[0-2]' => '\\d\\d',
	    'abcd' => 'a(?:b(?:c(?:d)?)?)?', 'acd' => 'a(?:b(?:c(?:d)?)?)?',
	    'a*?' => 'a*', 'a*' => 'a*?', 'a+?' => 'a+', 'a+' => 'a+?',
	    'a+?' => '\\H',
	    'a??' => 'a?', 'a?' => 'a??', 'a??b' => 'a?b', 'a?b' => 'a??b',
	    '(?:ab)??' => '(?:ab)*', '(?:ab)*' => '(?:ab)??',
	    'a.*b' => 'a.*?b', 'a.*?b' => 'a.*b', '(?x:a b)' => 'ab',
	    'a[^b]*b' => '(?s:a.*b)', '-+?' => '(?a:\\W)', ' +?' => '\\h',
            '(?x:a b)|(?x:c d)' => '(?x:(?:a b)|(?:c d))',
            '(?x:(?:a b)|(?:c d))' => '(?x:a b)|(?x:c d)',
	    'a{1,}?' => 'a', 'a' => 'a{1,}?',
	    'a{1,}?b' => 'a', 'ab' => 'a{1,}?',
	    'b{2,3}?' => 'b{2,3}', 'b{2,3}' => 'b{2,3}?',
	    '\t{1,}?' => '(?a:\s)', '-{1,}?' => '(?a:\S)',
	    '\t{1,}?' => '(?a:\\D)',
	    '(?a:\\d{2,3}?)' => '(?a:\\d\\d)',
	    'ab' => '(?x:a b)', 'Ab' => '(?ix:a B)',
	    "(?x:#comment\nab)" => 'ab', '(?x:[#])' => '#',
	    '(?#before)a' => 'a(?#after)',
	    'a(?#after)' => '(?#before)a', '(?:abc){3}' => 'abcabc',
	    '(?:abc){3}' => 'abcabcabc', '(?:a){2}' => '\\w\\w',
	    '(a)' => '(?:a)', '(?:a)' => '(a)',
	    '(?i:(a))' => '(?i:a)', '(?i:a)' => '(?i:(a))',
	    '(?a:(\\W))' => '(?a:\\W)', '(?a:(\\W))' => '(?a:\\W)',
	    '(?:b|)a' => '(b|)a', '(b|)a' => '(?:b|)a',
	    'a(?:b|)c' => 'a(b|)c', 'a(b|)c' => 'a(?:b|)c',
	    'a(?:bcd)+' => 'a(bcd)+', 'a(bcd)+' => 'a(?:bcd)+',
	    '(?:^a){1,}' => '(^a){1,}', '(^a){1,}' => '(?:^a){1,}',
	    '(^ ){1,}' => '\\h',
	    '(?:abc){1,2}' => '(abc){1,2}', '(abc){1,2}' => '(?:abc){1,2}',
	    '(\t \t)' => '(?a:\\s){3}',
	    '(?:ab)*' => '(ab)*', '(ab)*' => '(?:ab)*',
	    '(0+|1)' => '(?a:\\d)', '(?:0+|1)' => '(0+|1)',
	    '(0+|1)' => '(?:0+|1)',
	    '(?:abc)+$' => '(abc)+$', '(abc)+$' => '(?:abc)+$',
	    '(?:abc)+\z' => '(abc)+$', '(?:abc)+\z' => '(abc)+\Z',
	    '(?:abc){3}' => '(abc){3}', '(abc){3}' => '(?:abc){3}',
	    'a(?:b|)' => 'a(b|)', 'a(b|)' => 'a(?:b|)',
	    'a(?:b|)$' => 'a(b|)$', 'a(b|)$' => 'a(?:b|)$',
	    '(?:a\\d){2}' => '(a\\d){2}', '(a\\d){2}' => '(?:a\\d){2}',
	    '(?:aa){2}' => '(aa){2}', '(aa){2}' => '(?:aa){2}',
	    '1(?:aa){2}' => '1(aa){2}', '1(aa){2}' => '1(?:aa){2}',
	    '(?:aa){2}-' => '(aa){2}-', '(aa){2}-' => '(?:aa){2}-',
	    '(?a:1(\\s\\s){2})' => '(?a:1(?:\\s\\s){2})',
	    '1( \t){2}' => '(?a:\\s\\s){2}',
	    '1(23){2}' => '(?a:(\\d\\d){2})',
	    '(?:a|b)(?:c|d)' => '(a|b)(c|d)', '(a|b)(c|d)' => '(?:a|b)(?:c|d)',
	    '(?:(?:a|b)|(?:c|d))' => '((?:a|b)|(?:c|d))',
	    '((?:a|b)|(?:c|d))' => '(?:(?:a|b)|(?:c|d))',
	    '(?:(?:a|b)|(?:c|d))' => '(?:(a|b)|(?:c|d))',
	    '(?:(a|b)|(?:c|d))' => '(?:(?:a|b)|(?:c|d))',
	    '(?:(?:a|b)|(?:c|d))' => '((a|b)|(c|d))',
	    '((a|b)|(c|d))' => '(?:(?:a|b)|(?:c|d))',
	    '(a|b)(0|1)' => '[ab]\d', '(a|b)(0|1)' => '(?a:[ab]\d)', 
	    '(a|b)( |\t)' => '[ab]\h',
	    '(a|b)(c|d)' => '[ab]\D', '(a|b)(c|d)' => '[ab]\H',
	    '(a|b)(c|d)' => '(?a:[ab]\\D)',
	    'a(?:b+)?cd' => 'a(b+)?cd', 'a(b+)?cd' => 'a(?:b+)?cd',
	    '(?a:a(\\W+)?cd)' => '(?a:a(\\W+)?)',
	    '(?:[\\w\\-_.]+\\.)?(?:l(?:so|os)tr)\\.[a-z]{2,}' => '(?:[\\w\\-_.]+\\.)?(?:l(?:so|os)tr)\\.[a-z]{2,}',
	    '(?:busty|enlarge|milf)' => '(?:busty|casino|enlarge|gambling|milf|penis)',
	    '\\barcor\\.de\\b' => 'arcor\\.de',
	    '01-ringe?tones?\\.com' => '01-ringe?tones?[.]com',
	    '\\w(?=\\t)' => '\\w+(?=\\t)', '\\w(?=\\t)c' => '\\w(?=\\s)c',
	    '(?a:(?=\\t)\\W)' => '(?a:\\W)', '(?a:(?=\t)\s)' => '(?a:\s)',
	    '(?=\t) ' => '\h', '(?a:(?=-)\S)' => '(?a:\S)',
	    '\\d(?=ab)\\w' => '\\d(?=a).', '^(?=(a|b))' => '(?=[ab])',
	    '(?i:(?=a)b)' => '(?i:b)',
	    'foo(?!bar)' => 'foo', 'foo(?=bar)' => 'foo',
	    '^(?!b)' => '^(?!bar)', '^(?=\\H)a' => '\\H',
	    '(?m:^(?=\\H)a)' => '\\H', '(?s:^(?=\\H)a)' => '\\H',
	    'a(?<!b)c' => '(?<!b)c', '(?i:a(?<!b)c)' => '(?i:(?<!b)c)',
	    '\\b(?<=\w)b' => '(?<=\w)b', '\\B(?<=\w)b' => '(?<=\w)b',
	    '\\H(?<=\w)b' => '(?<=\w)b', '\\S(?<=\w)b' => '\\H(?<=\w)b',
	    '\\V(?<=\w)b' => '(?<=\w)b', '(?a:\S(?<=\w)b)' => '(?<=\w)b',
	    '\s(?<=\h)b' => '(?<=\h)b', '(?a:\s(?<=\h)b)' => '(?<=\h)b',
	    '\d(?<=0)b' => '(?<=0)b', '(?a:\d(?<=0)b)' => '(?<=0)b',
	    '\D(?<=a)b' => '(?<=a)b', '(?a:\D)(?<=a)b' => '(?<=a)b',
	    '\w(?<=\d)b' => '(?<=\d)b', '(?a:\w(?<=\d)b)' => '(?<=\d)b',
	    '\W(?<=\D)b' => '(?<=\D)b', '(?a:\W(?<=\D)b)' => '(?a:(?<=\D)b)',
	    '(?a:\w(?<!\d)b)' => '(?a:(?<!\d)b)',
	    '(?i:a(?<=\d)b)' => '(?i:(?<=\d)b)',
	    '\s(?<!\h)b' => '(?<!\h)b', '(?a:\s(?<!\h)b)' => '(?<!\h)b',
	    '\W(?<!\D)b' => '(?<!\D)b', '(?a:\W(?<!\D)b)' => '(?a:(?<!\D)b)',
	    '\S(?<!a)b' => '(?<!a)b', '(?a:\S(?<!a)b)' => '(?<!a)b',
	    '\d(?<!0)b' => '(?<!0)b', '(?a:\d(?<!0)b)' => '(?<!0)b',
	    '\D(?<!a)b' => '(?<!a)b', '(?a:\D(?<!a)b)' => '(?<!a)b',
	    '(?<!%)%20' => '%20', '(?<!x)%20' => '%20',
	    '(?<!%)%20' => '(?<!%)%20', '(?<!\\d)%20' => '(?<!\\d\\d)%20',
	    '(?<!(?i:\\w))%20' => '(?<![a-f])%20',
	    '(?<!\\w{2})%20' => '(?<![a-f]z)%20',
	    '(?<!((?:a|b)|(?:c|d)))%20' => '%20',
	    '%(?<!((?:a|b)|(?:c|d)))20' => '%20',
	    '%(?<!((?:a|b)|(?:c|d)))20' => '2',
	    '\\d(?<!0)ab' => 'ab', '\\s(?<!0)ab' => 'ab',
	    '\\w(?<!0) ' => '\\h', '\w(?<!a)a' => '(?i:a)',
	    '\\h(?<!0)ab' => '\\s(?<!0)ab', '(?a:\d(?<!0)\\W)' => '(?a:\\W)',
	    '(?a:\d(?<!0)\\s\\s)' => '(?a:\\s)',
	    '(?a:\\s(?<!\\t)\\d\\d)' => '(?a:\\d)',
	    '(?a:\s(?<! )\d\d)' => '(?a:\S)',
	    '(?a:(?=(?=(\d)\d))\d)' => '(?a:\d)',
	    'Hi' => '(Hi(ya)?|Hello|Greetings)',
	    '(?:casino|gambling|porn|\\bsms|milf|busty|prescription|pharmacy|penis|pills|enlarge)[\\w\\-_.]*\\.[a-z]{2,}' => '(?:busty|casino|enlarge|gambling|milf|penis|pharmacy|pills|porn|prescription|\\bsms)[\\w\\-_.]*\\.[a-z]{2,}',
            '^(?!(master|security|tempdb)$)^[a-z0-9_]+$' => '^(?!(master|security|tempdb)$)^[a-z0-9_]+',
	    '(?i:\\s*(?:very )?urgent\\s+(?:(?:and|&)\\s+)?\\b)' => '(?i:\\s*(?:very )?urgent\\s+(?:(?:and|&)\\s+)?\\b)',
	    '(?i:(?:Re:|\\[.{1,10}\\])?\\s*(?:very )?urgent\\s+(?:(?:and|&)\\s+)?(?:confidential|assistance|business|attention|reply|response|help)\\b)' => '(?i:(?:Re:|\\[.{1,10}\\])?\\s*(?:very )?urgent\\s+(?:(?:and|&)\\s+)?(?:confidential|assistance|business|attention|reply|response|help)\\b)',
	    '^contact \\S+\\@\\S+\\; run by ezmlm$' => '^contact \\S+\\@\\S+; run by ezmlm$',
            '\xe2' => '[\x00-\xff]', '\xe2\x98\xba' => '[\x00-\xff]',
	    '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\xff]' => '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff]',
	    '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff]' => '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\xff]',
            ' ' => '\x20', '\x20' => ' ', ' ' => '\040', '\040' => ' ',
            '\0' => '\x00', '\x00' => '\0', '\0' => '\x{0}', '\x{0}' => '\0',
            'a \N{U+263A}' => '\N{U+263A}',
            '\r' => '\\r', '\\r' => '\r',
            '\r' => '\N{U+000d}', '\N{U+000d}' => '\r',
            '\r' => '\x0D', '\x0D' => '\r',
            '\n' => '\\n', '\\n' => '\n',
            '\n' => '\N{U+000A}', '\N{U+000A}' => '\n',
            '\\h' => '\\s', '\\h ' => '(?i: )',
	    'tast' => 't.*st', 'tast' => 't.+st', 'tast' => 't.{0,}st',
	    'tast' => 't.{1,}st', 'tast' => 't.{0,2}st',
	    'tast' => 't.{1,3}st', 't.st' => 't.?st',
	    'ast' => '.*st', 'bombast' => 'b.*st',
	    'tast' => 't(?:a|b|c)st',
	    '[^/\\\\]*' => '[^/]*',
	    '.*' => '[^\\n]*', '[^\\n]*' => '.*',
	    '[^a-c]*' => '[^a]*', 'ab' => '(?:(?:)|.)(?:b)',
	    'ab' => '(?:.|(?:))(?:b)', '.' => '\N', '\N' => '.',
	    '\N' => '(?s:\N)', '(?s:\N)' => '\N',
	    '(?a:\d)' => '\d'
	   );
# things that should match but it isn''t clear how to make them:
# 'aa*b' => 'ab',
# '(?:aa)+' => 'a{2,}', 'a+a+' => 'a{2,}', 'a(?:b+)?c' => 'ab*c',
# 'a(?:b|)c' => 'ab?c', 'taast' => 't.*st'
# '!(?:aa){2}' => '\\baaaa', '(?:aa){2}3' => 'aaaa\\B'
# 'a(?=b)\\w' => 'ab', '^b' => '(?<!a)b'
# '(?:(?:(?:(?:\d){1,3})\\.){4}){1,2}' => '.+',
# '\x{85}' => '\s', \x{0660} => \d
# '.{3}$' => '.$', '.{6}$' => '...$', '(?i:abc){2}' => 'a[b]c', 
# '\\p{Lu}' => '[[:alpha:]]', '[^\\H]' => '\\h', '\\H' => '[^\\h]'
# '[\\W]' => '(?a:\\W)'

    # Computing a transitive closure is non-trivial - OTOH a classic
    # algorithm (Warshall) isn't that difficult to use.
    # It works by filling up an adjacency matrix, so first we number
    # our regexes...
    my %rx2idx;
    my @idx2rx;
    my $n = 0;
    foreach (@leq) {
	if (!exists($rx2idx{$_})) {
	    $rx2idx{$_} = $n++;
	    push @idx2rx, $_;
	}
    }

    # ...then fill the matrix (modelled as a simple array - 2
    # dimensions would only waste memory)
    my @matrix = ( 0 ) x ($n * $n);

    # ...with the explicit relation...
    my $k = 0;
    while ($k < scalar(@leq)) {
	$matrix[$n * $rx2idx{$leq[$k]} + $rx2idx{$leq[$k + 1]}] = 1;
	$k += 2;
    }

    # ...as well as the implicit reflexivity.
    $i = 0;
    while ($i < $n) {
        $matrix[$n * $i + $i] = 1;

        ++$i;
    }

    # Then we do the Warshall algorithm...
    my $j = 0;
    while ($j < $n) {
        $i = 0;
	while ($i < $n) {
	    if ($matrix[$n * $i + $j]) {
	        $k = 0;
		while ($k < $n) {
		    $matrix[$n * $i + $k] ||= $matrix[$n * $j + $k];

		    ++$k;
		}
	    }

	    ++$i;
	}

        ++$j;
    }

    # ...and translate the transitive closure back from indices to
    # regexp strings.
    @leq = ();
    $i = 0;
    while ($i < $n) {
	$j = 0;
	while ($j < $n) {
	    if ($matrix[$n * $i + $j]) {
		push @leq, $idx2rx[$i];
		push @leq, $idx2rx[$j];
	    }

	    ++$j;
	}

	++$i;
    }

    @nc = (
	   '' => 'a', '' => 'a+', 'a' => 'aa', 'a' => 'b', 'abc' => 'ac',
           'abcd' => 'bd', 'ab*c' => 'ab*d', 'ab*' => 'a\Z',
	   '[ab]' => 'ab', '.' => 'a',	'.' => '[a]',
	   '(?s:.)' => '[^\\n]', '\\d' => '[a]', 'a' => '\\d', 'a' => '\\s',
	   '\\d' => '[23]', '\\d' => '4', '.' => '\\d', '\\s' => 'a',
	   '\\s' => '[ \\t]', '\\s' => ' ', '.' => '\\s', '\\s' => '.',
	   '\\S' => 'a', '.' => '\\S', '\\S' => '\\S\\S', '\\n' => '.',
	   '[\\n]' => '.', '.' => '\\s', '[^0]' => '\\D',
	   '\\d' => '(?a:\\d)', '(?a:\\D)' => '[\\D]', '(?a:\\W)' => '\\W',
	   '(?a:\\S)' => '[\\S]',
	   '\\s\\d' => '(?a:\\w)', '(?a:\\W)' => '\\W', '\\s' => '(?a:\\s)',
	   '[\\da]' => '[\\db]', '[[:alpha:]]' => '[[:lower:]]',
	   '[[:alpha:]]' => '[[:upper:]]', '\\d' => '[0-9]{2}',
	   '[0-9]' => '\\d{2}', '\\s' => '\\s{2}', '\\s' => '[^x]{2}',
	   'y' => '[^x]{2}', 'a' => '\\w{2}', '[a]' => 'a{2}',
	   '\\p{IsLower}' => '\\p{IsUpper}', '[[:alpha:]]' => '\\p{Lu}', 
	   '[\\w]' => '[^\\w\\W]', '\\w' => '[[:alpha:]]',
	   '[[:alnum:]]' => '[[:alpha:]]', '_' => '[[:alnum:]]',
	   '[\w]' => '[^\sa]', '[\\w\\W]' => '[^\\w\\W]',
	   '\\d' => '[0-9]', '[^0-9]' => '\\D', # Unicode has numbers beyond ASCII - try e.g. \x{0660}" =~ /\d/
	   '[[:xdigit:]]' => '[[:digit:]]',
	   '\\w' => '[0-9a-zA-Z_]', '^$' => '^.$',
	   '\\D' => '\\W', '(?s:.)' => '.', '[^0]' => '\\w',
	   '(?m:^a)' => '^a', '.\\nb' => '^b', '^b' => '.\\nb',
	   '(?m:^a)' => '(?m:\\Aa)', '(?m:a$)' => 'a$',
	   '(?m:a$)' => '(?m:a\\Z)', 'ab{0,1}$' => 'a$',
	   '[^\\s]+' => '(?m:^a)', '[^\\w]+' => '(?m:^a)',
	   '(?i:a)' => '\\W', '(?i:0)' => '\\D', '(?i:a[\\n])' => '(?m:a$)',
	   '(?i:a\\nb)' => '.\\nb', '[a]' => '(?a:\\s)',
	   '[\\s]' => '(?a:\\s)', '(?i:a)' => '(?a:a)',
	   'a[b]c' => '(?i:abc){2}', '(?i:abc)' => '([aA][bB][cC]){2}',
	   '(?i:abc)' => '(?i:abc){2}', '(abc)' => '(abc){2}',
	   '(abc)+$' => '(?:abc)+\z', '(?:abc)+\Z' => '(abc)+\z',
	   '([ab])\\1' => '(?:([ab])\\1){2}',
	   'a[bc]de' => '[bc]e', 'a' => '^a', '[a-z]' => '^a',
	   'a*' => 'a', 'a*' => 'a+', 'xa{1,}y' => 'xay',
	   'a+' => 'a{2,}', 'ab+c' => 'abc', 'a+' => 'aaa',
	   'ab+c' => 'a+bc', '(:?ab){2}' => '(?:ab){3,}',
	   '(?:^a)*' => '^a', 'ab+c' => 'ab{2,}c', 'ab{1,}c' => 'abc',
	   '^-' => '\\b', '[a ]' => '\\b', 'a' => '\\ba',
	   '(?a:\\Sab)' => '\\b',
	   '\\B' => '\\b', '\\b' => '\\B', '\\b[a ]' => '(?:\\b[a ]){2}',
	   '\\B[a ]' => '(?:\\B[a ]){2}', '\\w+' => 'abc',
	   '\\w{3,}' => 'abc', '\\d{1,}' => '0+', 'a+' => '\\d+',
	   'a+' => 'b{1,}', 'abc' => 'a*bd', '(?i:a)' => 'a',
	   'a(?:b|)c' => 'ac', 'a(?:b|)d' => 'a(?:|c)d',
	   '[abc]' => 'a|b', 'a|b' => 'a',
	   '.$' => '.{3}$', '...$' => '.{6}$', '^a' => 'a$', 'a$' => '^a',
	   'a*' => 'a$', 'abcabc' => '(?:abc){3}',
	   'a{2}' => 'ab', 'ab' => 'a{2}', '\\w' => '.{2}',
	   '\\S' => '.{2}', '\\d' => '.{2}', '.' => '(?s:.){2}',
	   '(?s:.)' => '(?s:.){2}', '[a-z]' => '(?s:.){2}',
	   '\\w' => '(?s:.){2}', '\\W' => '(?s:.){2}',
	   '\\s' => '(?s:.){2}', '\\S' => '(?s:.){2}',
	   '\\d' => '(?s:.){2}', '\\D' => '(?s:.){2}',
	   'a' => '(?s:.){2}', '(?i:a)' => '(?s:.){2}',
	   '\\w' => '\\w{2}', '\\w' => '\\S{2}', '\\d' => '\\w{2}',
	   '\\W' => '\\W{2}', '\\s' => '\\W{2}', '\\S' => '\\S{2}',
	   '\\d' => '\\S{2}', '\\d' => '\\d{2}', '\\W' => '\\D{2}',
	   '\\s' => '\\D{2}', '\\D' => '\\D{2}',
	   '\\s' => '\\h', '\\H' => '[a-z0-9]', '\\h' => '[ \\t]',
	   '\\v' => '\\s', # vertical tab (0x0b) is vertical space but not space
	   '\\s' => '\\v', '\\v' => '\\S', '\\S' => '\\v',
	   '\\h' => '\\v', '\\v' => '\\h', '\\v' => '\\V',
	   '\\H' => '\\B', '\\Vx' => '\\Bx',
	   '1(?:aa){2}' => '\\baaaa', '(?:aa){2}!' => 'aaaa\\B',
	   '(?:ab{4}){1,2}' => '(?:ab{5}){1,}',
	   '(?:ab{5}){1,}c' => '(?:ab{4}){1,2}c',
	   '(?:ab{5}){1,}' => '(?:ab{4}c){1,2}',
	   'a{1,}?' => 'ab', 'a' => 'a{1,}?b',
	   '(?:(?<!((?:a|b)|(?:c|d)))\\s)' => '(?a:\\s)',
	   'ab{,1}c' => 'ab{0,1}c', 'ab{0,1}c' => 'ab{,1}c',
	   '(?:(?:(?:(?:\\d){1,3})\\.){4}){1,2}' => '(?:(?:(?:(?:\\d){1,3})\\.){5}){1,2}',
	    '(?:(?:(?:(?:\\d){1,3})\\.){5}){1,2}' => '(?:(?:(?:(?:\\d){1,3})\\.){4}){3,}',
	   '(?:busty|casino|enlarge|gambling|milf|penis)' => '(?:busty|enlarge|milf)',
	   '^(?!(master|security|tempdb)$)^[a-z0-9_]+' => '^(?!(master|security|tempdb)$)^[a-z0-9_]+$',
	   '(?:[\\w\\-_.]+\\.)?(?:l(?:so|os)tr)\\.[a-z]{2,}' => '(?:[\\w\\-_.]+\\.)?(?:l(?:so|os)tr)\\. ',
	   '\\d\\d' => '0[1-9]|[1-4][0-9]|5[0-2]', 't.st' => 'ta*st',
	   '(?=[ab])' => '^(?=(a|b))', '^(?=(a|b)).' => '(?=[ab])..',
	   'foo' => 'foo(?!bar)', '^(?!bar)' => '^(?!b)',
	   '(?=bar)b' => '(?!bar)b', '(?!bar)b' => '(?=bar)b',
	   '%20' => '(?<!%)%20', '%20' => '(?<!x)%20',
	   '(?<!((?:a|b)|(?:c|d)))%20' => '%21',
	   '(?<!\\d\\d)%20' => '(?<!\\d)%20', '(?<!\\w)b' => '(?<=\\w)b',
	   '(?<=\\w)b' => '(?<!\\w)b',
	   '[^/]+' => '[^/\\\\]+', '(?ix:a B)' => 'Ab',
	   'x(?:ab)*y' => 'x(?:ab)??y', '\x{263a}+' => ' +',
	   ' +' => '[\x{263a}]+', '(:?a+a+){3}b' => '(:?a+a+){4}b',
	   '[^a]*' => '[^a-c]+', 'a[^b]*$' => 'a[^bc]*$',
	   '(?:(?:)|.)(?:b)' => 'ab', '(?:.|(?:))(?:b)' => 'ab',
	   '.' => '\N{U+263A}', '\N{U+263A}' => '..', '\N{U+263A}' => '...',
	   '\N{U+000a}' => 'an \n', '\N' => '\w', '\W' => '\N',
	   '(?s:.)' => '\N',
           '\N{U+263A}' => '[\\x00-\\xff]', '[\\x00-\\xff]' => '\N{U+263A}',
	   '\N{U+263A}' => '\xe2\x98\xba', '\xe2\x98\xba' => '\N{U+263A}'
	  );

    @invalid = ( 'a' => '[a', '[\\N]' => 'a',
		 'a' => '[\N]', '(? :a)' => 'a' );
# perl-5.18 interprets 'a{2,1}' (with a warning) so that it matches 'a'
}

use Test::More tests => (scalar(@leq) / 2) + (scalar(@nc) / 2) + (scalar(@invalid) / 2);

$i = 0;
while ($i < scalar(@leq)) {
    # warn 'testing ' . $leq[$i] . ' <= ' . $leq[$i + 1] . "\n";
    ok(is_less_or_equal($leq[$i], $leq[$i + 1]),
       '/' . $leq[$i] . '/ <= /' . $leq[$i + 1] . '/');
    $i += 2;
}
 
$i = 0;
while ($i < scalar(@nc)) {
    ok(!is_less_or_equal($nc[$i], $nc[$i + 1]),
       '/' . $nc[$i] . '/ ? /' . $nc[$i + 1] . '/');
    $i += 2;
}
 
$i = 0;
while ($i < scalar(@invalid)) {
    eval {
	is_less_or_equal($invalid[$i], $invalid[$i + 1]);
    };
    ok($@, $invalid[$i] . ' vs. ' . $invalid[$i + 1]);
    $i += 2;
}