xref: /openbsd-src/regress/lib/libc/regex/tests (revision 8d4875efd4ecd36355f3a5d3cc1dd262105867ac)
1*8d4875efSotto#	$OpenBSD: tests,v 1.10 2021/04/02 14:20:57 otto Exp $
2df930be7Sderaadt#	$NetBSD: tests,v 1.5 1995/04/20 22:40:00 cgd Exp $
3df930be7Sderaadt
4df930be7Sderaadt# regular expression test set
5df930be7Sderaadt# Lines are at least three fields, separated by one or more tabs.  "" stands
6df930be7Sderaadt# for an empty field.  First field is an RE.  Second field is flags.  If
7df930be7Sderaadt# C flag given, regcomp() is expected to fail, and the third field is the
8df930be7Sderaadt# error name (minus the leading REG_).
9df930be7Sderaadt#
10df930be7Sderaadt# Otherwise it is expected to succeed, and the third field is the string to
11df930be7Sderaadt# try matching it against.  If there is no fourth field, the match is
12df930be7Sderaadt# expected to fail.  If there is a fourth field, it is the substring that
13df930be7Sderaadt# the RE is expected to match.  If there is a fifth field, it is a comma-
14df930be7Sderaadt# separated list of what the subexpressions should match, with - indicating
15df930be7Sderaadt# no match for that one.  In both the fourth and fifth fields, a (sub)field
16df930be7Sderaadt# starting with @ indicates that the (sub)expression is expected to match
17df930be7Sderaadt# a null string followed by the stuff after the @; this provides a way to
18df930be7Sderaadt# test where null strings match.  The character `N' in REs and strings
19df930be7Sderaadt# is newline, `S' is space, `T' is tab, `Z' is NUL.
20df930be7Sderaadt#
21df930be7Sderaadt# The full list of flags:
22df930be7Sderaadt#	-	placeholder, does nothing
23df930be7Sderaadt#	b	RE is a BRE, not an ERE
24df930be7Sderaadt#	&	try it as both an ERE and a BRE
25df930be7Sderaadt#	C	regcomp() error expected, third field is error name
26df930be7Sderaadt#	i	REG_ICASE
27df930be7Sderaadt#	m	("mundane") REG_NOSPEC
28df930be7Sderaadt#	s	REG_NOSUB (not really testable)
29df930be7Sderaadt#	n	REG_NEWLINE
30df930be7Sderaadt#	^	REG_NOTBOL
31df930be7Sderaadt#	$	REG_NOTEOL
32df930be7Sderaadt#	#	REG_STARTEND (see below)
33df930be7Sderaadt#	p	REG_PEND
34df930be7Sderaadt#
35df930be7Sderaadt# For REG_STARTEND, the start/end offsets are those of the substring
36df930be7Sderaadt# enclosed in ().
37df930be7Sderaadt
38df930be7Sderaadt# basics
39df930be7Sderaadta		&	a	a
40df930be7Sderaadtabc		&	abc	abc
41df930be7Sderaadtabc|de		-	abc	abc
42df930be7Sderaadta|b|c		-	abc	a
43df930be7Sderaadt
44df930be7Sderaadt# parentheses and perversions thereof
45df930be7Sderaadta(b)c		-	abc	abc
46df930be7Sderaadta\(b\)c		b	abc	abc
47df930be7Sderaadta(		C	EPAREN
48df930be7Sderaadta(		b	a(	a(
49df930be7Sderaadta\(		-	a(	a(
50df930be7Sderaadta\(		bC	EPAREN
51df930be7Sderaadta\(b		bC	EPAREN
52df930be7Sderaadta(b		C	EPAREN
53df930be7Sderaadta(b		b	a(b	a(b
54df930be7Sderaadt# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly)
55df930be7Sderaadta)		-	a)	a)
56df930be7Sderaadt)		-	)	)
57df930be7Sderaadt# end gagging (in a just world, those *should* give EPAREN)
58df930be7Sderaadta)		b	a)	a)
59df930be7Sderaadta\)		bC	EPAREN
60df930be7Sderaadt\)		bC	EPAREN
61df930be7Sderaadta()b		-	ab	ab
62df930be7Sderaadta\(\)b		b	ab	ab
63df930be7Sderaadt
64df930be7Sderaadt# anchoring and REG_NEWLINE
65df930be7Sderaadt^abc$		&	abc	abc
6609cba3fbSschwarze^b		&	abc
67df930be7Sderaadta^b		-	a^b
68df930be7Sderaadta^b		b	a^b	a^b
69df930be7Sderaadta$b		-	a$b
70df930be7Sderaadta$b		b	a$b	a$b
71df930be7Sderaadt^		&	abc	@abc
72df930be7Sderaadt$		&	abc	@
73df930be7Sderaadt^$		&	""	@
74df930be7Sderaadt$^		-	""	@
75df930be7Sderaadt\($\)\(^\)	b	""	@
76df930be7Sderaadt# stop retching, those are legitimate (although disgusting)
77df930be7Sderaadt^^		-	""	@
78df930be7Sderaadt$$		-	""	@
79df930be7Sderaadtb$		&	abNc
80df930be7Sderaadtb$		&n	abNc	b
8109cba3fbSschwarze^b		&	aNbNc
8209cba3fbSschwarzeb$		&	aNbNc
8309cba3fbSschwarze^a		&n	aNb	a
8409cba3fbSschwarze^b		&n	abc
85df930be7Sderaadt^b$		&n	aNbNc	b
86df930be7Sderaadt^$		&n	aNNb	@Nb
87df930be7Sderaadt^$		n	abc
88df930be7Sderaadt^$		n	abcN	@
89df930be7Sderaadt$^		n	aNNb	@Nb
90df930be7Sderaadt\($\)\(^\)	bn	aNNb	@Nb
91df930be7Sderaadt^^		n^	aNNb	@Nb
92df930be7Sderaadt$$		n	aNNb	@NN
9309cba3fbSschwarze^a		&^	a
9409cba3fbSschwarzea$		&$	a
9509cba3fbSschwarze^b		&^	abc
9609cba3fbSschwarze^b		&^	aNb
9709cba3fbSschwarze^a		&^n	aNb
9809cba3fbSschwarze^b		&^n	abc
9909cba3fbSschwarze^b		&^n	aNb	b
10009cba3fbSschwarzea$		&$n	bNa
10109cba3fbSschwarzeb$		&$n	bNa	b
102df930be7Sderaadta*(^b$)c*	-	b	b
103df930be7Sderaadta*\(^b$\)c*	b	b	b
104df930be7Sderaadt
105df930be7Sderaadt# certain syntax errors and non-errors
106df930be7Sderaadt|		C	EMPTY
107df930be7Sderaadt|		b	|	|
108df930be7Sderaadt*		C	BADRPT
109df930be7Sderaadt*		b	*	*
110df930be7Sderaadt+		C	BADRPT
111df930be7Sderaadt?		C	BADRPT
112df930be7Sderaadt""		&C	EMPTY
113df930be7Sderaadt()		-	abc	@abc
114df930be7Sderaadt\(\)		b	abc	@abc
115df930be7Sderaadta||b		C	EMPTY
116df930be7Sderaadt|ab		C	EMPTY
117df930be7Sderaadtab|		C	EMPTY
118df930be7Sderaadt(|a)b		C	EMPTY
119df930be7Sderaadt(a|)b		C	EMPTY
120df930be7Sderaadt(*a)		C	BADRPT
121df930be7Sderaadt(+a)		C	BADRPT
122df930be7Sderaadt(?a)		C	BADRPT
123df930be7Sderaadt({1}a)		C	BADRPT
124df930be7Sderaadt\(\{1\}a\)	bC	BADRPT
125df930be7Sderaadt(a|*b)		C	BADRPT
126df930be7Sderaadt(a|+b)		C	BADRPT
127df930be7Sderaadt(a|?b)		C	BADRPT
128df930be7Sderaadt(a|{1}b)	C	BADRPT
129df930be7Sderaadt^*		C	BADRPT
130df930be7Sderaadt^*		b	*	*
131df930be7Sderaadt^+		C	BADRPT
132df930be7Sderaadt^?		C	BADRPT
133df930be7Sderaadt^{1}		C	BADRPT
134df930be7Sderaadt^\{1\}		bC	BADRPT
135df930be7Sderaadt
136df930be7Sderaadt# metacharacters, backslashes
137df930be7Sderaadta.c		&	abc	abc
138df930be7Sderaadta[bc]d		&	abd	abd
139df930be7Sderaadta\*c		&	a*c	a*c
140df930be7Sderaadta\\b		&	a\b	a\b
141df930be7Sderaadta\\\*b		&	a\*b	a\*b
142df930be7Sderaadta\bc		&	abc	abc
143df930be7Sderaadta\		&C	EESCAPE
144df930be7Sderaadta\\bc		&	a\bc	a\bc
145df930be7Sderaadt\{		bC	BADRPT
146df930be7Sderaadta\[b		&	a[b	a[b
147df930be7Sderaadta[b		&C	EBRACK
148df930be7Sderaadt# trailing $ is a peculiar special case for the BRE code
149df930be7Sderaadta$		&	a	a
150df930be7Sderaadta$		&	a$
151df930be7Sderaadta\$		&	a
152df930be7Sderaadta\$		&	a$	a$
153df930be7Sderaadta\\$		&	a
154df930be7Sderaadta\\$		&	a$
155df930be7Sderaadta\\$		&	a\$
156df930be7Sderaadta\\$		&	a\	a\
157df930be7Sderaadt
158df930be7Sderaadt# back references, ugh
159df930be7Sderaadta\(b\)\2c	bC	ESUBREG
160df930be7Sderaadta\(b\1\)c	bC	ESUBREG
161df930be7Sderaadta\(b*\)c\1d	b	abbcbbd	abbcbbd	bb
162df930be7Sderaadta\(b*\)c\1d	b	abbcbd
163df930be7Sderaadta\(b*\)c\1d	b	abbcbbbd
164df930be7Sderaadt^\(.\)\1	b	abc
165df930be7Sderaadta\([bc]\)\1d	b	abcdabbd	abbd	b
166df930be7Sderaadta\(\([bc]\)\2\)*d	b	abbccd	abbccd
167df930be7Sderaadta\(\([bc]\)\2\)*d	b	abbcbd
168df930be7Sderaadt# actually, this next one probably ought to fail, but the spec is unclear
169df930be7Sderaadta\(\(b\)*\2\)*d		b	abbbd	abbbd
170df930be7Sderaadt# here is a case that no NFA implementation does right
171df930be7Sderaadt\(ab*\)[ab]*\1	b	ababaaa	ababaaa	a
172df930be7Sderaadt# check out normal matching in the presence of back refs
173df930be7Sderaadt\(a\)\1bcd	b	aabcd	aabcd
174df930be7Sderaadt\(a\)\1bc*d	b	aabcd	aabcd
175df930be7Sderaadt\(a\)\1bc*d	b	aabd	aabd
176df930be7Sderaadt\(a\)\1bc*d	b	aabcccd	aabcccd
177df930be7Sderaadt\(a\)\1bc*[ce]d	b	aabcccd	aabcccd
178df930be7Sderaadt^\(a\)\1b\(c\)*cd$	b	aabcccd	aabcccd
1792ff451efSotto\(b*\)\(a*\1\)*	b	ab	a
180b6ae5db5Sotto\([^_]*\)\(_*\1\)*	b	foo_foo_bar_bar_bar_baz	foo_foo	foo,_foo
181b6ae5db5Sotto\([^_]*\)\(_*\1\)*	b	bar_bar_bar_baz	bar_bar_bar	bar,_bar
182b6ae5db5Sotto\([^_]*\)\(_*\1\)*	b	foo_bar_baz	foo	foo
18305c0ab40Sotto\(.*\)\1	b	""	""
18405c0ab40Sotto\(.*\)\1	b	a	""
18505c0ab40Sotto\(.*\)\1	b	aa	aa
18605c0ab40Sotto\(.*\)\1	b	aaa	aa
18705c0ab40Sotto\(.*\)\1	b	aaaa	aaaa
18805c0ab40Sotto\([^_]*\)\1	b	""	""
18905c0ab40Sotto\([^_]*\)\1	b	a	""
19005c0ab40Sotto\([^_]*\)\1	b	aa	aa
19105c0ab40Sotto\([^_]*\)\1	b	aaa	aa
19205c0ab40Sotto\([^_]*\)\1	b	aaaa	aaaa
1932ff451efSottofoo\(.*\)bar\1	b	foolbarl	foolbarl	l
1942ff451efSottofoo\(.*\)bar\1	b	foobar	foobar	""
1952ff451efSotto\(\(.\)b\)*\1	b	aba
1962ff451efSotto\(\(.\)b\)*\1	b	abba
1972ff451efSotto\(\(.\)b\)*\1	b	abbba
1982ff451efSotto\(\(.\)b\)*\1	b	abbbba	bbbb	bb,b
1992ff451efSotto\(\(.\)b\)*\1	b	abbbbba	abbbbb	bb,b
2002ff451efSotto\(\(.\)b\)*\1	b	abbbbbba	abbbbb	bb,b
2012ff451efSotto\(\(.\)b\)*\1	b	abbbbbbbbbbbbbba	abbbbbbbbbbbbb	bb,b
2022ff451efSotto\(\(.\)b\)*\1	b	abbbbbbbbbbbbbbba	abbbbbbbbbbbbbbb	bb,b
20331242beeSschwarze# these used to segfault, buffer underflow in engine.c, backref()
20431242beeSschwarze\(^a\)*\(b.\)\2	b^	sbxbxe	bxbx	-,bx
20531242beeSschwarze\([[:<:]]a\)*\(b.\)\2	b^	sbxbxe	bxbx	-,bx
206df930be7Sderaadt
207df930be7Sderaadt# ordinary repetitions
208df930be7Sderaadtab*c		&	abc	abc
209df930be7Sderaadtab+c		-	abc	abc
210df930be7Sderaadtab?c		-	abc	abc
211df930be7Sderaadta\(*\)b		b	a*b	a*b
212df930be7Sderaadta\(**\)b	b	ab	ab
213df930be7Sderaadta\(***\)b	bC	BADRPT
214df930be7Sderaadt*a		b	*a	*a
215df930be7Sderaadt**a		b	a	a
216df930be7Sderaadt***a		bC	BADRPT
217df930be7Sderaadt
218df930be7Sderaadt# the dreaded bounded repetitions
219df930be7Sderaadt{		&	{	{
220df930be7Sderaadt{abc		&	{abc	{abc
221df930be7Sderaadt{1		C	BADRPT
222df930be7Sderaadt{1}		C	BADRPT
223df930be7Sderaadta{b		&	a{b	a{b
224df930be7Sderaadta{1}b		-	ab	ab
225df930be7Sderaadta\{1\}b		b	ab	ab
226df930be7Sderaadta{1,}b		-	ab	ab
227df930be7Sderaadta\{1,\}b	b	ab	ab
228df930be7Sderaadta{1,2}b		-	aab	aab
229df930be7Sderaadta\{1,2\}b	b	aab	aab
230df930be7Sderaadta{1		C	EBRACE
231df930be7Sderaadta\{1		bC	EBRACE
232df930be7Sderaadta{1a		C	EBRACE
233df930be7Sderaadta\{1a		bC	EBRACE
234df930be7Sderaadta{1a}		C	BADBR
235df930be7Sderaadta\{1a\}		bC	BADBR
236df930be7Sderaadta{,2}		-	a{,2}	a{,2}
237df930be7Sderaadta\{,2\}		bC	BADBR
238df930be7Sderaadta{,}		-	a{,}	a{,}
239df930be7Sderaadta\{,\}		bC	BADBR
240df930be7Sderaadta{1,x}		C	BADBR
241df930be7Sderaadta\{1,x\}	bC	BADBR
242df930be7Sderaadta{1,x		C	EBRACE
243df930be7Sderaadta\{1,x		bC	EBRACE
244df930be7Sderaadta{300}		C	BADBR
245df930be7Sderaadta\{300\}	bC	BADBR
246df930be7Sderaadta{1,0}		C	BADBR
247df930be7Sderaadta\{1,0\}	bC	BADBR
248df930be7Sderaadtab{0,0}c	-	abcac	ac
249df930be7Sderaadtab\{0,0\}c	b	abcac	ac
250df930be7Sderaadtab{0,1}c	-	abcac	abc
251df930be7Sderaadtab\{0,1\}c	b	abcac	abc
252df930be7Sderaadtab{0,3}c	-	abbcac	abbc
253df930be7Sderaadtab\{0,3\}c	b	abbcac	abbc
254df930be7Sderaadtab{1,1}c	-	acabc	abc
255df930be7Sderaadtab\{1,1\}c	b	acabc	abc
256df930be7Sderaadtab{1,3}c	-	acabc	abc
257df930be7Sderaadtab\{1,3\}c	b	acabc	abc
258df930be7Sderaadtab{2,2}c	-	abcabbc	abbc
259df930be7Sderaadtab\{2,2\}c	b	abcabbc	abbc
260df930be7Sderaadtab{2,4}c	-	abcabbc	abbc
261df930be7Sderaadtab\{2,4\}c	b	abcabbc	abbc
262df930be7Sderaadt((a{1,10}){1,10}){1,10}	-	a	a	a,a
263df930be7Sderaadt
264df930be7Sderaadt# multiple repetitions
265df930be7Sderaadta**		&C	BADRPT
266df930be7Sderaadta++		C	BADRPT
267df930be7Sderaadta??		C	BADRPT
268df930be7Sderaadta*+		C	BADRPT
269df930be7Sderaadta*?		C	BADRPT
270df930be7Sderaadta+*		C	BADRPT
271df930be7Sderaadta+?		C	BADRPT
272df930be7Sderaadta?*		C	BADRPT
273df930be7Sderaadta?+		C	BADRPT
274df930be7Sderaadta{1}{1}		C	BADRPT
275df930be7Sderaadta*{1}		C	BADRPT
276df930be7Sderaadta+{1}		C	BADRPT
277df930be7Sderaadta?{1}		C	BADRPT
278df930be7Sderaadta{1}*		C	BADRPT
279df930be7Sderaadta{1}+		C	BADRPT
280df930be7Sderaadta{1}?		C	BADRPT
281df930be7Sderaadta*{b}		-	a{b}	a{b}
282df930be7Sderaadta\{1\}\{1\}	bC	BADRPT
283df930be7Sderaadta*\{1\}		bC	BADRPT
284df930be7Sderaadta\{1\}*		bC	BADRPT
285df930be7Sderaadt
286df930be7Sderaadt# brackets, and numerous perversions thereof
287df930be7Sderaadta[b]c		&	abc	abc
288df930be7Sderaadta[ab]c		&	abc	abc
289df930be7Sderaadta[^ab]c		&	adc	adc
290df930be7Sderaadta[]b]c		&	a]c	a]c
291df930be7Sderaadta[[b]c		&	a[c	a[c
292df930be7Sderaadta[-b]c		&	a-c	a-c
293df930be7Sderaadta[^]b]c		&	adc	adc
294df930be7Sderaadta[^-b]c		&	adc	adc
295df930be7Sderaadta[b-]c		&	a-c	a-c
296df930be7Sderaadta[b		&C	EBRACK
297df930be7Sderaadta[]		&C	EBRACK
298df930be7Sderaadta[1-3]c		&	a2c	a2c
299df930be7Sderaadta[3-1]c		&C	ERANGE
300df930be7Sderaadta[1-3-5]c	&C	ERANGE
301df930be7Sderaadta[[.-.]--]c	&	a-c	a-c
302df930be7Sderaadta[1-		&C	ERANGE
303df930be7Sderaadta[[.		&C	EBRACK
304df930be7Sderaadta[[.x		&C	EBRACK
305df930be7Sderaadta[[.x.		&C	EBRACK
306df930be7Sderaadta[[.x.]		&C	EBRACK
307df930be7Sderaadta[[.x.]]	&	ax	ax
308df930be7Sderaadta[[.x,.]]	&C	ECOLLATE
309df930be7Sderaadta[[.one.]]b	&	a1b	a1b
310df930be7Sderaadta[[.notdef.]]b	&C	ECOLLATE
311df930be7Sderaadta[[.].]]b	&	a]b	a]b
312df930be7Sderaadta[[:alpha:]]c	&	abc	abc
313df930be7Sderaadta[[:notdef:]]c	&C	ECTYPE
314df930be7Sderaadta[[:		&C	EBRACK
315df930be7Sderaadta[[:alpha	&C	EBRACK
316df930be7Sderaadta[[:alpha:]	&C	EBRACK
317df930be7Sderaadta[[:alpha,:]	&C	ECTYPE
318df930be7Sderaadta[[:]:]]b	&C	ECTYPE
319df930be7Sderaadta[[:-:]]b	&C	ECTYPE
320df930be7Sderaadta[[:alph:]]	&C	ECTYPE
321df930be7Sderaadta[[:alphabet:]]	&C	ECTYPE
322df930be7Sderaadt[[:alnum:]]+	-	-%@a0X-	a0X
323df930be7Sderaadt[[:alpha:]]+	-	-%@aX0-	aX
324df930be7Sderaadt[[:blank:]]+	-	aSSTb	SST
325df930be7Sderaadt[[:cntrl:]]+	-	aNTb	NT
326df930be7Sderaadt[[:digit:]]+	-	a019b	019
327df930be7Sderaadt[[:graph:]]+	-	Sa%bS	a%b
328df930be7Sderaadt[[:lower:]]+	-	AabC	ab
329df930be7Sderaadt[[:print:]]+	-	NaSbN	aSb
330df930be7Sderaadt[[:punct:]]+	-	S%-&T	%-&
331df930be7Sderaadt[[:space:]]+	-	aSNTb	SNT
332df930be7Sderaadt[[:upper:]]+	-	aBCd	BC
333df930be7Sderaadt[[:xdigit:]]+	-	p0f3Cq	0f3C
334df930be7Sderaadta[[=b=]]c	&	abc	abc
335df930be7Sderaadta[[=		&C	EBRACK
336df930be7Sderaadta[[=b		&C	EBRACK
337df930be7Sderaadta[[=b=		&C	EBRACK
338df930be7Sderaadta[[=b=]		&C	EBRACK
339df930be7Sderaadta[[=b,=]]	&C	ECOLLATE
340df930be7Sderaadta[[=one=]]b	&	a1b	a1b
341df930be7Sderaadt
342df930be7Sderaadt# complexities
343df930be7Sderaadta(((b)))c	-	abc	abc
344df930be7Sderaadta(b|(c))d	-	abd	abd
345df930be7Sderaadta(b*|c)d	-	abbd	abbd
346df930be7Sderaadt# just gotta have one DFA-buster, of course
347df930be7Sderaadta[ab]{20}	-	aaaaabaaaabaaaabaaaab	aaaaabaaaabaaaabaaaab
348df930be7Sderaadt# and an inline expansion in case somebody gets tricky
349df930be7Sderaadta[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab]	-	aaaaabaaaabaaaabaaaab	aaaaabaaaabaaaabaaaab
350df930be7Sderaadt# and in case somebody just slips in an NFA...
351df930be7Sderaadta[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night)	-	aaaaabaaaabaaaabaaaabweeknights	aaaaabaaaabaaaabaaaabweeknights
352df930be7Sderaadt# fish for anomalies as the number of states passes 32
353df930be7Sderaadt12345678901234567890123456789	-	a12345678901234567890123456789b	12345678901234567890123456789
354df930be7Sderaadt123456789012345678901234567890	-	a123456789012345678901234567890b	123456789012345678901234567890
355df930be7Sderaadt1234567890123456789012345678901	-	a1234567890123456789012345678901b	1234567890123456789012345678901
356df930be7Sderaadt12345678901234567890123456789012	-	a12345678901234567890123456789012b	12345678901234567890123456789012
357df930be7Sderaadt123456789012345678901234567890123	-	a123456789012345678901234567890123b	123456789012345678901234567890123
358df930be7Sderaadt# and one really big one, beyond any plausible word width
359df930be7Sderaadt1234567890123456789012345678901234567890123456789012345678901234567890	-	a1234567890123456789012345678901234567890123456789012345678901234567890b	1234567890123456789012345678901234567890123456789012345678901234567890
360df930be7Sderaadt# fish for problems as brackets go past 8
361df930be7Sderaadt[ab][cd][ef][gh][ij][kl][mn]	-	xacegikmoq	acegikm
362df930be7Sderaadt[ab][cd][ef][gh][ij][kl][mn][op]	-	xacegikmoq	acegikmo
363df930be7Sderaadt[ab][cd][ef][gh][ij][kl][mn][op][qr]	-	xacegikmoqy	acegikmoq
364df930be7Sderaadt[ab][cd][ef][gh][ij][kl][mn][op][q]	-	xacegikmoqy	acegikmoq
365df930be7Sderaadt
366df930be7Sderaadt# subtleties of matching
367df930be7Sderaadtabc		&	xabcy	abc
368df930be7Sderaadta\(b\)?c\1d	b	acd
369df930be7SderaadtaBc		i	Abc	Abc
370df930be7Sderaadta[Bc]*d		i	abBCcd	abBCcd
371df930be7Sderaadt0[[:upper:]]1	&i	0a1	0a1
372df930be7Sderaadt0[[:lower:]]1	&i	0A1	0A1
373df930be7Sderaadta[^b]c		&i	abc
374df930be7Sderaadta[^b]c		&i	aBc
375df930be7Sderaadta[^b]c		&i	adc	adc
376df930be7Sderaadt[a]b[c]		-	abc	abc
377df930be7Sderaadt[a]b[a]		-	aba	aba
378df930be7Sderaadt[abc]b[abc]	-	abc	abc
379df930be7Sderaadt[abc]b[abd]	-	abd	abd
380df930be7Sderaadta(b?c)+d	-	accd	accd
381df930be7Sderaadt(wee|week)(knights|night)	-	weeknights	weeknights
382df930be7Sderaadt(we|wee|week|frob)(knights|night|day)	-	weeknights	weeknights
383df930be7Sderaadta[bc]d		-	xyzaaabcaababdacd	abd
384df930be7Sderaadta[ab]c		-	aaabc	abc
385df930be7Sderaadtabc		s	abc	abc
386df930be7Sderaadta*		&	b	@b
387df930be7Sderaadt
388df930be7Sderaadt# Let's have some fun -- try to match a C comment.
389df930be7Sderaadt# first the obvious, which looks okay at first glance...
390df930be7Sderaadt/\*.*\*/	-	/*x*/	/*x*/
391df930be7Sderaadt# but...
392df930be7Sderaadt/\*.*\*/	-	/*x*/y/*z*/	/*x*/y/*z*/
393df930be7Sderaadt# okay, we must not match */ inside; try to do that...
394df930be7Sderaadt/\*([^*]|\*[^/])*\*/	-	/*x*/	/*x*/
395df930be7Sderaadt/\*([^*]|\*[^/])*\*/	-	/*x*/y/*z*/	/*x*/
396df930be7Sderaadt# but...
397df930be7Sderaadt/\*([^*]|\*[^/])*\*/	-	/*x**/y/*z*/	/*x**/y/*z*/
398df930be7Sderaadt# and a still fancier version, which does it right (I think)...
399df930be7Sderaadt/\*([^*]|\*+[^*/])*\*+/	-	/*x*/	/*x*/
400df930be7Sderaadt/\*([^*]|\*+[^*/])*\*+/	-	/*x*/y/*z*/	/*x*/
401df930be7Sderaadt/\*([^*]|\*+[^*/])*\*+/	-	/*x**/y/*z*/	/*x**/
402df930be7Sderaadt/\*([^*]|\*+[^*/])*\*+/	-	/*x****/y/*z*/	/*x****/
403df930be7Sderaadt/\*([^*]|\*+[^*/])*\*+/	-	/*x**x*/y/*z*/	/*x**x*/
404df930be7Sderaadt/\*([^*]|\*+[^*/])*\*+/	-	/*x***x/y/*z*/	/*x***x/y/*z*/
405df930be7Sderaadt
406df930be7Sderaadt# subexpressions
407df930be7Sderaadta(b)(c)d	-	abcd	abcd	b,c
408df930be7Sderaadta(((b)))c	-	abc	abc	b,b,b
409df930be7Sderaadta(b|(c))d	-	abd	abd	b,-
410df930be7Sderaadta(b*|c|e)d	-	abbd	abbd	bb
411df930be7Sderaadta(b*|c|e)d	-	acd	acd	c
412df930be7Sderaadta(b*|c|e)d	-	ad	ad	@d
413df930be7Sderaadta(b?)c		-	abc	abc	b
414df930be7Sderaadta(b?)c		-	ac	ac	@c
415df930be7Sderaadta(b+)c		-	abc	abc	b
416df930be7Sderaadta(b+)c		-	abbbc	abbbc	bbb
417df930be7Sderaadta(b*)c		-	ac	ac	@c
418df930be7Sderaadt(a|ab)(bc([de]+)f|cde)	-	abcdef	abcdef	a,bcdef,de
419df930be7Sderaadt# the regression tester only asks for 9 subexpressions
420df930be7Sderaadta(b)(c)(d)(e)(f)(g)(h)(i)(j)k	-	abcdefghijk	abcdefghijk	b,c,d,e,f,g,h,i,j
421df930be7Sderaadta(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l	-	abcdefghijkl	abcdefghijkl	b,c,d,e,f,g,h,i,j,k
422df930be7Sderaadta([bc]?)c	-	abc	abc	b
423df930be7Sderaadta([bc]?)c	-	ac	ac	@c
424df930be7Sderaadta([bc]+)c	-	abc	abc	b
425df930be7Sderaadta([bc]+)c	-	abcc	abcc	bc
426df930be7Sderaadta([bc]+)bc	-	abcbc	abcbc	bc
427df930be7Sderaadta(bb+|b)b	-	abb	abb	b
428df930be7Sderaadta(bbb+|bb+|b)b	-	abb	abb	b
429df930be7Sderaadta(bbb+|bb+|b)b	-	abbb	abbb	bb
430df930be7Sderaadta(bbb+|bb+|b)bb	-	abbb	abbb	b
431df930be7Sderaadt(.*).*		-	abcdef	abcdef	abcdef
432df930be7Sderaadt(a*)*		-	bc	@b	@b
433df930be7Sderaadt
434df930be7Sderaadt# do we get the right subexpression when it is used more than once?
435df930be7Sderaadta(b|c)*d	-	ad	ad	-
436df930be7Sderaadta(b|c)*d	-	abcd	abcd	c
437df930be7Sderaadta(b|c)+d	-	abd	abd	b
438df930be7Sderaadta(b|c)+d	-	abcd	abcd	c
439df930be7Sderaadta(b|c?)+d	-	ad	ad	@d
440df930be7Sderaadta(b|c?)+d	-	abcd	abcd	@d
441df930be7Sderaadta(b|c){0,0}d	-	ad	ad	-
442df930be7Sderaadta(b|c){0,1}d	-	ad	ad	-
443df930be7Sderaadta(b|c){0,1}d	-	abd	abd	b
444df930be7Sderaadta(b|c){0,2}d	-	ad	ad	-
445df930be7Sderaadta(b|c){0,2}d	-	abcd	abcd	c
446df930be7Sderaadta(b|c){0,}d	-	ad	ad	-
447df930be7Sderaadta(b|c){0,}d	-	abcd	abcd	c
448df930be7Sderaadta(b|c){1,1}d	-	abd	abd	b
449df930be7Sderaadta(b|c){1,1}d	-	acd	acd	c
450df930be7Sderaadta(b|c){1,2}d	-	abd	abd	b
451df930be7Sderaadta(b|c){1,2}d	-	abcd	abcd	c
452df930be7Sderaadta(b|c){1,}d	-	abd	abd	b
453df930be7Sderaadta(b|c){1,}d	-	abcd	abcd	c
454df930be7Sderaadta(b|c){2,2}d	-	acbd	acbd	b
455df930be7Sderaadta(b|c){2,2}d	-	abcd	abcd	c
456df930be7Sderaadta(b|c){2,4}d	-	abcd	abcd	c
457df930be7Sderaadta(b|c){2,4}d	-	abcbd	abcbd	b
458df930be7Sderaadta(b|c){2,4}d	-	abcbcd	abcbcd	c
459df930be7Sderaadta(b|c){2,}d	-	abcd	abcd	c
460df930be7Sderaadta(b|c){2,}d	-	abcbd	abcbd	b
461df930be7Sderaadta(b+|((c)*))+d	-	abd	abd	@d,@d,-
462df930be7Sderaadta(b+|((c)*))+d	-	abcd	abcd	@d,@d,-
463df930be7Sderaadt
464df930be7Sderaadt# check out the STARTEND option
46509cba3fbSschwarze^[abc]		&#	a(b)c	b
46609cba3fbSschwarze^[abc]		&#	a(xb)c
46709cba3fbSschwarze^[abc]		&#	aN(b)c	b
46809cba3fbSschwarze^[abc]		&n#	a(b)c	b
46909cba3fbSschwarze^[abc]		&n#	a(xb)c
47009cba3fbSschwarze^[abc]		&n#	aN(b)c	b
47109cba3fbSschwarze^[abc]		&^#	a(b)c
47209cba3fbSschwarze^[abc]		&^#	a(xb)c
47309cba3fbSschwarze^[abc]		&^#	aN(b)c
47409cba3fbSschwarze^[abc]		&n^#	a(b)c
47509cba3fbSschwarze^[abc]		&n^#	a(xb)c
47609cba3fbSschwarze^[abc]		&n^#	aN(b)c	b
477df930be7Sderaadt[abc]		&#	a(d)c
478df930be7Sderaadt[abc]		&#	a(bc)d	b
479df930be7Sderaadt[abc]		&#	a(dc)d	c
480df930be7Sderaadt.		&#	a()c
481df930be7Sderaadtb.*c		&#	b(bc)c	bc
482df930be7Sderaadtb.*		&#	b(bc)c	bc
483df930be7Sderaadt.*c		&#	b(bc)c	bc
484df930be7Sderaadt
485df930be7Sderaadt# plain strings, with the NOSPEC flag
486df930be7Sderaadtabc		m	abc	abc
487df930be7Sderaadtabc		m	xabcy	abc
488df930be7Sderaadtabc		m	xyz
489df930be7Sderaadta*b		m	aba*b	a*b
490df930be7Sderaadta*b		m	ab
491df930be7Sderaadt""		mC	EMPTY
492df930be7Sderaadt
493df930be7Sderaadt# cases involving NULs
494df930be7SderaadtaZb		&	a	a
495df930be7SderaadtaZb		&p	a
496df930be7SderaadtaZb		&p#	(aZb)	aZb
497df930be7SderaadtaZ*b		&p#	(ab)	ab
498df930be7Sderaadta.b		&#	(aZb)	aZb
499df930be7Sderaadta.*		&#	(aZb)c	aZb
500df930be7Sderaadt
501df930be7Sderaadt# word boundaries (ick)
502df930be7Sderaadt[[:<:]]a	&	a	a
503b2695360Sdoug\<a		&	a	a
504df930be7Sderaadt[[:<:]]a	&	ba
505b2695360Sdoug\<a		&	ba
506df930be7Sderaadt[[:<:]]a	&	-a	a
507b2695360Sdoug\<a		&	-a	a
50809cba3fbSschwarze[[:<:]]a	&	Na	a
50909cba3fbSschwarze\<a		&	Na	a
51009cba3fbSschwarze[[:<:]]a	&n	a	a
51109cba3fbSschwarze\<a		&n	a	a
51209cba3fbSschwarze[[:<:]]a	&n	ba
51309cba3fbSschwarze\<a		&n	ba
51409cba3fbSschwarze[[:<:]]a	&n	-a	a
51509cba3fbSschwarze\<a		&n	-a	a
51609cba3fbSschwarze[[:<:]]a	&n	Na	a
51709cba3fbSschwarze\<a		&n	Na	a
51809cba3fbSschwarze[[:<:]]a	&^	a
51909cba3fbSschwarze\<a		&^	a
52009cba3fbSschwarze[[:<:]]a	&^	ba
52109cba3fbSschwarze\<a		&^	ba
52209cba3fbSschwarze[[:<:]]a	&^	-a	a
52309cba3fbSschwarze\<a		&^	-a	a
52409cba3fbSschwarze[[:<:]]a	&^	Na	a
52509cba3fbSschwarze\<a		&^	Na	a
52609cba3fbSschwarze[[:<:]]a	&n^	a
52709cba3fbSschwarze\<a		&n^	a
52809cba3fbSschwarze[[:<:]]a	&n^	ba
52909cba3fbSschwarze\<a		&n^	ba
53009cba3fbSschwarze[[:<:]]a	&n^	-a	a
53109cba3fbSschwarze\<a		&n^	-a	a
53209cba3fbSschwarze[[:<:]]a	&n^	Na	a
53309cba3fbSschwarze\<a		&n^	Na	a
53409cba3fbSschwarze[[:<:]]b	&#	a(b)c	b
53509cba3fbSschwarze\<b		&#	a(b)c	b
53609cba3fbSschwarze[[:<:]]b	&#	a(xb)c
53709cba3fbSschwarze\<b		&#	a(xb)c
53809cba3fbSschwarze[[:<:]]b	&#	-(b)c	b
53909cba3fbSschwarze\<b		&#	-(b)c	b
54009cba3fbSschwarze[[:<:]]b	&#	aN(b)c	b
54109cba3fbSschwarze\<b		&#	aN(b)c	b
54209cba3fbSschwarze[[:<:]]b	&n#	a(b)c	b
54309cba3fbSschwarze\<b		&n#	a(b)c	b
54409cba3fbSschwarze[[:<:]]b	&n#	a(xb)c
54509cba3fbSschwarze\<b		&n#	a(xb)c
54609cba3fbSschwarze[[:<:]]b	&n#	-(b)c	b
54709cba3fbSschwarze\<b		&n#	-(b)c	b
54809cba3fbSschwarze[[:<:]]b	&n#	aN(b)c	b
54909cba3fbSschwarze\<b		&n#	aN(b)c	b
55009cba3fbSschwarze[[:<:]]b	&^#	a(b)c
55109cba3fbSschwarze\<b		&^#	a(b)c
55209cba3fbSschwarze[[:<:]]b	&^#	a(xb)c
55309cba3fbSschwarze\<b		&^#	a(xb)c
55409cba3fbSschwarze[[:<:]]b	&^#	-(b)c	b
55509cba3fbSschwarze\<b		&^#	-(b)c	b
55609cba3fbSschwarze[[:<:]]b	&^#	aN(b)c	b
55709cba3fbSschwarze\<b		&^#	aN(b)c	b
55809cba3fbSschwarze[[:<:]]b	&n^#	a(b)c
55909cba3fbSschwarze\<b		&n^#	a(b)c
56009cba3fbSschwarze[[:<:]]b	&n^#	a(xb)c
56109cba3fbSschwarze\<b		&n^#	a(xb)c
56209cba3fbSschwarze[[:<:]]b	&n^#	-(b)c	b
56309cba3fbSschwarze\<b		&n^#	-(b)c	b
56409cba3fbSschwarze[[:<:]]b	&n^#	aN(b)c	b
56509cba3fbSschwarze\<b		&n^#	aN(b)c	b
566df930be7Sderaadta[[:>:]]	&	a	a
567b2695360Sdouga\>		&	a	a
568df930be7Sderaadta[[:>:]]	&	ab
569b2695360Sdouga\>		&	ab
570df930be7Sderaadta[[:>:]]	&	a-	a
571b2695360Sdouga\>		&	a-	a
572df930be7Sderaadt[[:<:]]a.c[[:>:]]	&	axcd-dayc-dazce-abc	abc
573b2695360Sdoug\<a.c\>			&	axcd-dayc-dazce-abc	abc
574df930be7Sderaadt[[:<:]]a.c[[:>:]]	&	axcd-dayc-dazce-abc-q	abc
575b2695360Sdoug\<a.c\>			&	axcd-dayc-dazce-abc-q	abc
576df930be7Sderaadt[[:<:]]a.c[[:>:]]	&	axc-dayc-dazce-abc	axc
577b2695360Sdoug\<a.c\>			&	axc-dayc-dazce-abc	axc
578df930be7Sderaadt[[:<:]]b.c[[:>:]]	&	a_bxc-byc_d-bzc-q	bzc
579b2695360Sdoug\<b.c\>			&	a_bxc-byc_d-bzc-q	bzc
580df930be7Sderaadt[[:<:]].x..[[:>:]]	&	y_xa_-_xb_y-_xc_-axdc	_xc_
581b2695360Sdoug\<.x..\>		&	y_xa_-_xb_y-_xc_-axdc	_xc_
582df930be7Sderaadt[[:<:]]a_b[[:>:]]	&	x_a_b
583b2695360Sdoug\<a_b\>			&	x_a_b
584df930be7Sderaadt
585df930be7Sderaadt# past problems, and suspected problems
586df930be7Sderaadt(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A])	-	A1	A1
587df930be7Sderaadtabcdefghijklmnop	i	abcdefghijklmnop	abcdefghijklmnop
588df930be7Sderaadtabcdefghijklmnopqrstuv	i	abcdefghijklmnopqrstuv	abcdefghijklmnopqrstuv
589df930be7Sderaadt(ALAK)|(ALT[AB])|(CC[123]1)|(CM[123]1)|(GAMC)|(LC[23][EO ])|(SEM[1234])|(SL[ES][12])|(SLWW)|(SLF )|(SLDT)|(VWH[12])|(WH[34][EW])|(WP1[ESN])	-	CC11	CC11
590df930be7SderaadtCC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a	-	CC11	CC11
591df930be7SderaadtChar \([a-z0-9_]*\)\[.*	b	Char xyz[k	Char xyz[k	xyz
592df930be7Sderaadta?b	-	ab	ab
593df930be7Sderaadt-\{0,1\}[0-9]*$	b	-5	-5
594b6ae5db5Sotto
595b6faad1aSmillert# FreeBSD PR 130504
596b6faad1aSmillert(.|())(b)	-	ab	ab
597b6faad1aSmillert(()|.)(b)	-	ab	ab
598*8d4875efSotto
599*8d4875efSotto# Some BRE cases where \{0,\} makes a backref go wrong, as reported by Michael Paoli
600*8d4875efSottoY*\(x\)\1	b	YYxx	YYxx
601*8d4875efSottoY\{2,\}\(x\)\1	b	YYxx	YYxx
602*8d4875efSotto# Fails currently
603*8d4875efSotto#Y\{0,\}\(x\)\1	b	YYxx	YYxx
604*8d4875efSottoY\{0,\}\(x\)	b	YYxx	YYx
605*8d4875efSottoY\{2,\}x\{1,\}	b	YYxx	YYxx
606*8d4875efSottoY\{2,\}x\{0,\}z	b	YYxxz	YYxxz
607*8d4875efSottoY\{0,\}x\{0,\}z	b	YYxxz	YYxxz
608*8d4875efSottoY\{2,\}\(xy\)\1	b	YYxyxy	YYxyxy
609*8d4875efSotto# Fails currently
610*8d4875efSotto#Y\{0,\}\(xy\)\1	b	YYxyxy	YYxyxy
611*8d4875efSottoY*\(xy\)\1	b	YYxyxy	YYxyxy
612*8d4875efSottoY\{0,\}\(xy\)xy	b	YYxyxy	YYxyxy
613