mirror of
https://github.com/Perl/perl5.git
synced 2026-01-26 16:39:36 +00:00
regex: Add optimizing regnode
It turns out that any character class whose UTF-8 representation is two bytes long, and where all elements share the same first byte can be represented by a compact, fast regnode designed for the purpose. This commit adds that regnode, ANYOFHbbm. ANYOFHb already exists for classes where all elements have the same first byte, and this just changes the two-byte ones to use a bitmap instead of an inversion list. The advantages of this are that no conversion to code point is required (the continuation byte is just looked up in the bitmap) and no inversion list is needed. The inversion list would occupy more space, from 4 to 34 extra 64-bit words, plus an AV and SV, depending on what elements the class matches. Many characters in the Latin, Greek, Cyrillic, Greek, Hebrew, Arabic, and several other (lesser-known) scripts are of this form. It would be possible to extend this technique to larger bitmaps, but this commit is a start.
This commit is contained in:
parent
4bc69097ef
commit
4c8c99df3c
@ -2211,6 +2211,7 @@ ES |SSize_t|study_chunk |NN RExC_state_t *pRExC_state \
|
||||
|U32 flags|U32 depth|bool was_mutate_ok
|
||||
ES |void |rck_elide_nothing|NN regnode *node
|
||||
ESR |SV * |get_ANYOFM_contents|NN const regnode * n
|
||||
ESR |SV * |get_ANYOFHbbm_contents|NN const regnode * n
|
||||
ES |void |populate_bitmap_from_invlist \
|
||||
|NN SV * invlist \
|
||||
|const UV offset \
|
||||
|
||||
1
embed.h
1
embed.h
@ -1016,6 +1016,7 @@
|
||||
#define edit_distance S_edit_distance
|
||||
#define execute_wildcard(a,b,c,d,e,f,g) S_execute_wildcard(aTHX_ a,b,c,d,e,f,g)
|
||||
#define find_first_differing_byte_pos S_find_first_differing_byte_pos
|
||||
#define get_ANYOFHbbm_contents(a) S_get_ANYOFHbbm_contents(aTHX_ a)
|
||||
#define get_ANYOFM_contents(a) S_get_ANYOFM_contents(aTHX_ a)
|
||||
#define get_ANYOF_cp_list_for_ssc(a,b) S_get_ANYOF_cp_list_for_ssc(aTHX_ a,b)
|
||||
#define get_quantifier_value(a,b,c) S_get_quantifier_value(aTHX_ a,b,c)
|
||||
|
||||
@ -631,6 +631,11 @@ will be lost.
|
||||
start byte
|
||||
ANYOFRb packed 1 Like ANYOFR, but all matches share the same
|
||||
UTF-8 start byte, given in the flags field
|
||||
|
||||
ANYOFHbbm none bbm Like ANYOFHb, but only for 2-byte UTF-8
|
||||
characters; uses a bitmap to match the
|
||||
continuation byte
|
||||
|
||||
ANYOFM byte 1 Like ANYOF, but matches an invariant byte
|
||||
as determined by the mask and arg
|
||||
NANYOFM byte 1 complement of ANYOFM
|
||||
|
||||
5
proto.h
5
proto.h
@ -6297,6 +6297,11 @@ PERL_STATIC_INLINE Size_t S_find_first_differing_byte_pos(const U8 * s1, const U
|
||||
#define PERL_ARGS_ASSERT_FIND_FIRST_DIFFERING_BYTE_POS \
|
||||
assert(s1); assert(s2)
|
||||
#endif
|
||||
STATIC SV * S_get_ANYOFHbbm_contents(pTHX_ const regnode * n)
|
||||
__attribute__warn_unused_result__;
|
||||
#define PERL_ARGS_ASSERT_GET_ANYOFHBBM_CONTENTS \
|
||||
assert(n)
|
||||
|
||||
STATIC SV * S_get_ANYOFM_contents(pTHX_ const regnode * n)
|
||||
__attribute__warn_unused_result__;
|
||||
#define PERL_ARGS_ASSERT_GET_ANYOFM_CONTENTS \
|
||||
|
||||
79
regcomp.c
79
regcomp.c
@ -6188,6 +6188,21 @@ S_study_chunk(pTHX_
|
||||
(regnode_charclass *) scan);
|
||||
break;
|
||||
|
||||
case ANYOFHbbm:
|
||||
{
|
||||
SV* cp_list = get_ANYOFHbbm_contents(scan);
|
||||
|
||||
if (flags & SCF_DO_STCLASS_OR) {
|
||||
ssc_union(data->start_class, cp_list, invert);
|
||||
}
|
||||
else if (flags & SCF_DO_STCLASS_AND) {
|
||||
ssc_intersection(data->start_class, cp_list, invert);
|
||||
}
|
||||
|
||||
SvREFCNT_dec_NN(cp_list);
|
||||
break;
|
||||
}
|
||||
|
||||
case NANYOFM: /* NANYOFM already contains the inversion of the
|
||||
input ANYOF data, so, unlike things like
|
||||
NPOSIXA, don't change 'invert' to TRUE */
|
||||
@ -20519,13 +20534,46 @@ S_optimize_regclass(pTHX_
|
||||
Size_t len = find_first_differing_byte_pos(low_utf8,
|
||||
high_utf8,
|
||||
MIN(low_len, high_len));
|
||||
|
||||
if (len == 1) {
|
||||
|
||||
/* No need to convert to I8 for EBCDIC as this is an exact
|
||||
* match */
|
||||
*anyof_flags = low_utf8[0];
|
||||
op = ANYOFHb;
|
||||
|
||||
if (high_len == 2) {
|
||||
/* If the elements matched all have a 2-byte UTF-8
|
||||
* representation, with the first byte being the same,
|
||||
* we can use a compact, fast regnode. capable of
|
||||
* matching any combination of continuation byte
|
||||
* patterns.
|
||||
*
|
||||
* (A similar regnode could be created for the Latin1
|
||||
* range; the complication being that it could match
|
||||
* non-UTF8 targets. The internal bitmap would serve
|
||||
* both cases; with some extra code in regexec.c) */
|
||||
op = ANYOFHbbm;
|
||||
*ret = REGNODE_GUTS(pRExC_state, op, regarglen[op]);
|
||||
FILL_NODE(*ret, op);
|
||||
((struct regnode_bbm *) REGNODE_p(*ret))->first_byte = low_utf8[0],
|
||||
|
||||
/* The 64 bit (or 32 on EBCCDIC) map can be looked up
|
||||
* directly based on the continuation byte, without
|
||||
* needing to convert to code point */
|
||||
populate_bitmap_from_invlist(
|
||||
cp_list,
|
||||
|
||||
/* The base code point is from the start byte */
|
||||
TWO_BYTE_UTF8_TO_NATIVE(low_utf8[0],
|
||||
UTF_CONTINUATION_MARK | 0),
|
||||
|
||||
((struct regnode_bbm *) REGNODE_p(*ret))->bitmap,
|
||||
REGNODE_BBM_BITMAP_LEN);
|
||||
RExC_emit += NODE_STEP_REGNODE + regarglen[op];
|
||||
return op;
|
||||
}
|
||||
else {
|
||||
op = ANYOFHb;
|
||||
}
|
||||
}
|
||||
else {
|
||||
op = ANYOFHs;
|
||||
@ -21429,6 +21477,22 @@ S_get_ANYOFM_contents(pTHX_ const regnode * n) {
|
||||
return cp_list;
|
||||
}
|
||||
|
||||
STATIC SV *
|
||||
S_get_ANYOFHbbm_contents(pTHX_ const regnode * n) {
|
||||
PERL_ARGS_ASSERT_GET_ANYOFHBBM_CONTENTS;
|
||||
|
||||
SV * cp_list = NULL;
|
||||
populate_invlist_from_bitmap(
|
||||
((struct regnode_bbm *) n)->bitmap,
|
||||
REGNODE_BBM_BITMAP_LEN * CHARBITS,
|
||||
&cp_list,
|
||||
|
||||
/* The base cp is from the start byte plus a zero continuation */
|
||||
TWO_BYTE_UTF8_TO_NATIVE(((struct regnode_bbm *) n)->first_byte,
|
||||
UTF_CONTINUATION_MARK | 0));
|
||||
return cp_list;
|
||||
}
|
||||
|
||||
/*
|
||||
- regdump - dump a regexp onto Perl_debug_log in vaguely comprehensible form
|
||||
*/
|
||||
@ -22054,6 +22118,17 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
|
||||
|
||||
SvREFCNT_dec(cp_list);
|
||||
}
|
||||
else if (k == ANYOFHbbm) {
|
||||
SV * cp_list = get_ANYOFHbbm_contents(o);
|
||||
Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
|
||||
|
||||
Perl_sv_catsv(aTHX_ sv, invlist_contents(cp_list,
|
||||
FALSE /* output suitable for catsv */
|
||||
));
|
||||
Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
|
||||
|
||||
SvREFCNT_dec(cp_list);
|
||||
}
|
||||
else if (k == POSIXD || k == NPOSIXD) {
|
||||
U8 index = FLAGS(o) * 2;
|
||||
if (index < C_ARRAY_LENGTH(anyofs)) {
|
||||
|
||||
14
regcomp.h
14
regcomp.h
@ -171,6 +171,20 @@ struct regnode_2 {
|
||||
U16 arg2;
|
||||
};
|
||||
|
||||
#define REGNODE_BBM_BITMAP_LEN \
|
||||
/* 6 info bits requires 64 bits; 5 => 32 */ \
|
||||
((1 << (UTF_CONTINUATION_BYTE_INFO_BITS)) / CHARBITS)
|
||||
|
||||
/* Used for matching any two-byte UTF-8 character whose start byte is known.
|
||||
* The array is a bitmap capable of representing any possible continuation
|
||||
* byte. */
|
||||
struct regnode_bbm {
|
||||
U8 first_byte;
|
||||
U8 type;
|
||||
U16 next_off;
|
||||
U8 bitmap[REGNODE_BBM_BITMAP_LEN];
|
||||
};
|
||||
|
||||
#define ANYOF_BITMAP_SIZE (NUM_ANYOF_CODE_POINTS / CHARBITS)
|
||||
|
||||
/* Note that these form structs which are supersets of the next smaller one, by
|
||||
|
||||
@ -109,6 +109,9 @@ ANYOFRb ANYOFR, packed 1 S ; Like ANYOFR, but all matches share the sam
|
||||
# different or else this wouldn't be a range.) So we might as well displense
|
||||
# with the comparisons that ANYOFRs would do, and go directly to do the
|
||||
# conversion .
|
||||
|
||||
ANYOFHbbm ANYOFHbbm none bbm S ; Like ANYOFHb, but only for 2-byte UTF-8 characters; uses a bitmap to match the continuation byte
|
||||
|
||||
ANYOFM ANYOFM, byte 1 S ; Like ANYOF, but matches an invariant byte as determined by the mask and arg
|
||||
NANYOFM ANYOFM, byte 1 S ; complement of ANYOFM
|
||||
|
||||
|
||||
42
regexec.c
42
regexec.c
@ -2297,6 +2297,8 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
|
||||
case ANYOFH_tb_p8:
|
||||
case ANYOFHb_tb_pb:
|
||||
case ANYOFHb_tb_p8:
|
||||
case ANYOFHbbm_tb_pb:
|
||||
case ANYOFHbbm_tb_p8:
|
||||
case ANYOFHr_tb_pb:
|
||||
case ANYOFHr_tb_p8:
|
||||
case ANYOFHs_tb_pb:
|
||||
@ -2333,6 +2335,20 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
|
||||
}
|
||||
break;
|
||||
|
||||
case ANYOFHbbm_t8_pb:
|
||||
case ANYOFHbbm_t8_p8:
|
||||
{
|
||||
/* We know what the first byte of any matched string should be. */
|
||||
U8 first_byte = FLAGS(c);
|
||||
|
||||
/* And a bitmap defines all the legal 2nd byte matches */
|
||||
REXEC_FBC_FIND_NEXT_UTF8_BYTE_SCAN(first_byte,
|
||||
( s < strend
|
||||
&& BITMAP_TEST(((struct regnode_bbm *) c)->bitmap,
|
||||
(U8) s[1] & UTF_CONTINUATION_MASK)));
|
||||
}
|
||||
break;
|
||||
|
||||
case ANYOFHr_t8_pb:
|
||||
case ANYOFHr_t8_p8:
|
||||
anyofh_list = GET_ANYOFH_INVLIST(prog, c);
|
||||
@ -7469,6 +7485,19 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
|
||||
goto increment_locinput;
|
||||
break;
|
||||
|
||||
case ANYOFHbbm:
|
||||
if ( ! utf8_target
|
||||
|| NEXTCHR_IS_EOS
|
||||
|| ANYOF_FLAGS(scan) != (U8) locinput[0]
|
||||
|| locinput >= reginfo->strend
|
||||
|| ! BITMAP_TEST(( (struct regnode_bbm *) scan)->bitmap,
|
||||
(U8) locinput[1] & UTF_CONTINUATION_MASK))
|
||||
{
|
||||
sayNO;
|
||||
}
|
||||
goto increment_locinput;
|
||||
break;
|
||||
|
||||
case ANYOFHr:
|
||||
if ( ! utf8_target
|
||||
|| NEXTCHR_IS_EOS
|
||||
@ -10292,6 +10321,7 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
|
||||
|
||||
case ANYOFH_tb: /* ANYOFH only can match UTF-8 targets */
|
||||
case ANYOFHb_tb:
|
||||
case ANYOFHbbm_tb:
|
||||
case ANYOFHr_tb:
|
||||
case ANYOFHs_tb:
|
||||
break;
|
||||
@ -10327,6 +10357,18 @@ S_regrepeat(pTHX_ regexp *prog, char **startposp, const regnode *p,
|
||||
}
|
||||
break;
|
||||
|
||||
case ANYOFHbbm:
|
||||
while ( hardcount < max
|
||||
&& scan + 1 < this_eol
|
||||
&& (U8) *scan == ANYOF_FLAGS(p)
|
||||
&& BITMAP_TEST(( (struct regnode_bbm *) p)->bitmap,
|
||||
(U8) scan[1] & UTF_CONTINUATION_MASK))
|
||||
{
|
||||
scan += 2; /* This node only matces 2-byte UTF-8 */
|
||||
hardcount++;
|
||||
}
|
||||
break;
|
||||
|
||||
case ANYOFHr_t8:
|
||||
anyofh_list = GET_ANYOFH_INVLIST(prog, p);
|
||||
while ( hardcount < max
|
||||
|
||||
1915
regnodes.h
1915
regnodes.h
File diff suppressed because it is too large
Load Diff
72
t/re/anyof.t
72
t/re/anyof.t
@ -489,7 +489,7 @@ my @tests = (
|
||||
'[\x{00}-{INFTY}]' => 'SANY',
|
||||
'[\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
|
||||
'[\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-HIGHEST_CP]',
|
||||
'[\x{102}\x{104}]' => 'ANYOFHb[0102 0104]',
|
||||
'[\x{102}\x{104}]' => 'ANYOFHbbm[0102 0104]',
|
||||
'[\x{102}-\x{104}{HIGHEST_CP}]' => 'ANYOFH[0102-0104 HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{101}]' => 'ANYOFRb[0101-0104]',
|
||||
'[\x{102}-\x{104}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
|
||||
@ -506,86 +506,86 @@ my @tests = (
|
||||
'[\x{102}-\x{104}\x{105}]' => 'ANYOFRb[0102-0105]',
|
||||
'[\x{102}-\x{104}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
|
||||
'[\x{102}-\x{104}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{106}]' => 'ANYOFHb[0102-0104 0106]',
|
||||
'[\x{102}-\x{104}\x{106}]' => 'ANYOFHbbm[0102-0104 0106]',
|
||||
'[\x{102}-\x{104}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
|
||||
'[\x{102}-\x{104}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0106-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0108-010A HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOFHb[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{INFTY}]' => 'ANYOFH[0101-INFTY]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-{HIGHEST_CP}]' => 'ANYOFH[0101-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOFHb[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOFHb[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOFHb[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOFHb[0101-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOFHb[0101-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{102}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{103}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{104}]' => 'ANYOFHbbm[0101-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{105}]' => 'ANYOFHbbm[0101-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{106}]' => 'ANYOFHbbm[0101-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{107}]' => 'ANYOFRb[0101-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{108}]' => 'ANYOFRb[0101-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{109}]' => 'ANYOFRb[0101-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10A}]' => 'ANYOFRb[0101-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{101}-\x{10B}]' => 'ANYOFRb[0101-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOFHb[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOFHb[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{102}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{103}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{104}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{107}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{108}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{109}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10A}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10B}]' => 'ANYOFRb[0102-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{102}-\x{10C}]' => 'ANYOFRb[0102-010C]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOFHb[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOFHb[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{104}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{107}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{108}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{109}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10A}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10B}]' => 'ANYOFRb[0102-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{103}-\x{10C}]' => 'ANYOFRb[0102-010C]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOFHb[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOFHb[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{107}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{108}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{109}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10A}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10B}]' => 'ANYOFRb[0102-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{104}-\x{10C}]' => 'ANYOFRb[0102-010C]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOFHb[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}]' => 'ANYOFHbbm[0102-0105 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{INFTY}]' => 'ANYOFH[0102-INFTY]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-{HIGHEST_CP}]' => 'ANYOFH[0102-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOFHb[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{106}]' => 'ANYOFHbbm[0102-0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{107}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{108}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{109}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10A}]' => 'ANYOFRb[0102-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10B}]' => 'ANYOFRb[0102-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{105}-\x{10C}]' => 'ANYOFRb[0102-010C]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOFHb[0102-0104 0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}]' => 'ANYOFHbbm[0102-0104 0106 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{INFTY}]' => 'ANYOFH[0102-0104 0106-INFTY]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-{HIGHEST_CP}]' => 'ANYOFH[0102-0104 0106-HIGHEST_CP]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOFHb[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOFHb[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOFHb[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOFHb[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOFHb[0102-0104 0106-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOFHb[0102-0104 0106-010C]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOFHb[0102-0104 0107-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOFHb[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOFHb[0102-0104 0108-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{107}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{108}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{109}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10A}]' => 'ANYOFHbbm[0102-0104 0106-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10B}]' => 'ANYOFHbbm[0102-0104 0106-010B]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{106}-\x{10C}]' => 'ANYOFHbbm[0102-0104 0106-010C]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{107}]' => 'ANYOFHbbm[0102-0104 0107-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{108}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{109}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{10A}]' => 'ANYOFHbbm[0102-0104 0108-010A]',
|
||||
'[\x{102}-\x{104}\x{108}-\x{10A}\x{10B}]' => 'ANYOFHbbm[0102-0104 0108-010B]',
|
||||
'[\x{103}\x{102}]' => 'EXACTFU_REQ8 <\x{103}>',
|
||||
'[\x{104}\x{102}]' => 'ANYOFHb[0102 0104]',
|
||||
'[\x{104}\x{102}]' => 'ANYOFHbbm[0102 0104]',
|
||||
'[\x{104}\x{102}\x{103}]' => 'ANYOFRb[0102-0104]',
|
||||
'[\x{106}-{INFTY}\x{104}]' => 'ANYOFH[0104 0106-INFTY]',
|
||||
'[\x{106}-{INFTY}\x{104}-{INFTY}]' => 'ANYOFH[0104-INFTY]',
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user