2014-07-24 18:32:38 +02:00
# This set of tests is for features that are compatible with all versions of
# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and
# 32-bit PCRE libraries, and also using the perltest.pl script.
#forbid_utf
2015-09-08 19:01:17 +02:00
#newline_default lf any anycrlf
2014-07-24 18:32:38 +02:00
#perltest
/the quick brown fox/
the quick brown fox
0: the quick brown fox
What do you know about the quick brown fox?
0: the quick brown fox
2015-09-16 18:49:48 +02:00
\= Expect no match
The quick brown FOX
No match
2014-07-24 18:32:38 +02:00
What do you know about THE QUICK BROWN FOX?
No match
/The quick brown fox/i
the quick brown fox
0: the quick brown fox
The quick brown FOX
0: The quick brown FOX
What do you know about the quick brown fox?
0: the quick brown fox
What do you know about THE QUICK BROWN FOX?
0: THE QUICK BROWN FOX
/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
abcd\t\n\r\f\a\e9;\$\\?caxyz
0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz
/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
abxyzpqrrrabbxyyyypqAzz
0: abxyzpqrrrabbxyyyypqAzz
abxyzpqrrrabbxyyyypqAzz
0: abxyzpqrrrabbxyyyypqAzz
aabxyzpqrrrabbxyyyypqAzz
0: aabxyzpqrrrabbxyyyypqAzz
aaabxyzpqrrrabbxyyyypqAzz
0: aaabxyzpqrrrabbxyyyypqAzz
aaaabxyzpqrrrabbxyyyypqAzz
0: aaaabxyzpqrrrabbxyyyypqAzz
abcxyzpqrrrabbxyyyypqAzz
0: abcxyzpqrrrabbxyyyypqAzz
aabcxyzpqrrrabbxyyyypqAzz
0: aabcxyzpqrrrabbxyyyypqAzz
aaabcxyzpqrrrabbxyyyypAzz
0: aaabcxyzpqrrrabbxyyyypAzz
aaabcxyzpqrrrabbxyyyypqAzz
0: aaabcxyzpqrrrabbxyyyypqAzz
aaabcxyzpqrrrabbxyyyypqqAzz
0: aaabcxyzpqrrrabbxyyyypqqAzz
aaabcxyzpqrrrabbxyyyypqqqAzz
0: aaabcxyzpqrrrabbxyyyypqqqAzz
aaabcxyzpqrrrabbxyyyypqqqqAzz
0: aaabcxyzpqrrrabbxyyyypqqqqAzz
aaabcxyzpqrrrabbxyyyypqqqqqAzz
0: aaabcxyzpqrrrabbxyyyypqqqqqAzz
aaabcxyzpqrrrabbxyyyypqqqqqqAzz
0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz
aaaabcxyzpqrrrabbxyyyypqAzz
0: aaaabcxyzpqrrrabbxyyyypqAzz
abxyzzpqrrrabbxyyyypqAzz
0: abxyzzpqrrrabbxyyyypqAzz
aabxyzzzpqrrrabbxyyyypqAzz
0: aabxyzzzpqrrrabbxyyyypqAzz
aaabxyzzzzpqrrrabbxyyyypqAzz
0: aaabxyzzzzpqrrrabbxyyyypqAzz
aaaabxyzzzzpqrrrabbxyyyypqAzz
0: aaaabxyzzzzpqrrrabbxyyyypqAzz
abcxyzzpqrrrabbxyyyypqAzz
0: abcxyzzpqrrrabbxyyyypqAzz
aabcxyzzzpqrrrabbxyyyypqAzz
0: aabcxyzzzpqrrrabbxyyyypqAzz
aaabcxyzzzzpqrrrabbxyyyypqAzz
0: aaabcxyzzzzpqrrrabbxyyyypqAzz
aaaabcxyzzzzpqrrrabbxyyyypqAzz
0: aaaabcxyzzzzpqrrrabbxyyyypqAzz
aaaabcxyzzzzpqrrrabbbxyyyypqAzz
0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz
aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
aaabcxyzpqrrrabbxyyyypABzz
0: aaabcxyzpqrrrabbxyyyypABzz
aaabcxyzpqrrrabbxyyyypABBzz
0: aaabcxyzpqrrrabbxyyyypABBzz
>>>aaabxyzpqrrrabbxyyyypqAzz
0: aaabxyzpqrrrabbxyyyypqAzz
>aaaabxyzpqrrrabbxyyyypqAzz
0: aaaabxyzpqrrrabbxyyyypqAzz
>>>>abcxyzpqrrrabbxyyyypqAzz
0: abcxyzpqrrrabbxyyyypqAzz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abxyzpqrrabbxyyyypqAzz
No match
abxyzpqrrrrabbxyyyypqAzz
No match
abxyzpqrrrabxyyyypqAzz
No match
aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
No match
aaaabcxyzzzzpqrrrabbbxyyypqAzz
No match
aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
No match
/^(abc){1,2}zz/
abczz
0: abczz
1: abc
abcabczz
0: abcabczz
1: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
zz
No match
abcabcabczz
No match
>>abczz
No match
/^(b+?|a){1,2}?c/
bc
0: bc
1: b
bbc
0: bbc
1: b
bbbc
0: bbbc
1: bb
bac
0: bac
1: a
bbac
0: bbac
1: a
aac
0: aac
1: a
abbbbbbbbbbbc
0: abbbbbbbbbbbc
1: bbbbbbbbbbb
bbbbbbbbbbbac
0: bbbbbbbbbbbac
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaac
No match
abbbbbbbbbbbac
No match
/^(b+|a){1,2}c/
bc
0: bc
1: b
bbc
0: bbc
1: bb
bbbc
0: bbbc
1: bbb
bac
0: bac
1: a
bbac
0: bbac
1: a
aac
0: aac
1: a
abbbbbbbbbbbc
0: abbbbbbbbbbbc
1: bbbbbbbbbbb
bbbbbbbbbbbac
0: bbbbbbbbbbbac
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaac
No match
abbbbbbbbbbbac
No match
/^(b+|a){1,2}?bc/
bbc
0: bbc
1: b
/^(b*|ba){1,2}?bc/
babc
0: babc
1: ba
bbabc
0: bbabc
1: ba
bababc
0: bababc
1: ba
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bababbc
No match
babababc
No match
/^(ba|b*){1,2}?bc/
babc
0: babc
1: ba
bbabc
0: bbabc
1: ba
bababc
0: bababc
1: ba
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bababbc
No match
babababc
No match
/^\ca\cA\c[;\c:/
\x01\x01\e;z
0: \x01\x01\x1b;z
/^[ab\]cde]/
athing
0: a
bthing
0: b
]thing
0: ]
cthing
0: c
dthing
0: d
ething
0: e
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
fthing
No match
[thing
No match
\\thing
No match
/^[]cde]/
]thing
0: ]
cthing
0: c
dthing
0: d
ething
0: e
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
athing
No match
fthing
No match
/^[^ab\]cde]/
fthing
0: f
[thing
0: [
\\thing
0: \
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
athing
No match
bthing
No match
]thing
No match
cthing
No match
dthing
No match
ething
No match
/^[^]cde]/
athing
0: a
fthing
0: f
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
]thing
No match
cthing
No match
dthing
No match
ething
No match
/^\<5C> /
<20>
0: \x81
/^<5E> /
<20>
0: \xff
/^[0-9]+$/
0
0: 0
1
0: 1
2
0: 2
3
0: 3
4
0: 4
5
0: 5
6
0: 6
7
0: 7
8
0: 8
9
0: 9
10
0: 10
100
0: 100
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
/^.*nter/
enter
0: enter
inter
0: inter
uponter
0: uponter
/^xxx[0-9]+$/
xxx0
0: xxx0
xxx1234
0: xxx1234
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xxx
No match
/^.+[0-9][0-9][0-9]$/
x123
0: x123
2015-09-16 18:49:48 +02:00
x1234
0: x1234
2014-07-24 18:32:38 +02:00
xx123
0: xx123
123456
0: 123456
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123
No match
/^.+?[0-9][0-9][0-9]$/
x123
0: x123
2015-09-16 18:49:48 +02:00
x1234
0: x1234
2014-07-24 18:32:38 +02:00
xx123
0: xx123
123456
0: 123456
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123
No match
/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
abc!pqr=apquxz.ixr.zzz.ac.uk
0: abc!pqr=apquxz.ixr.zzz.ac.uk
1: abc
2: pqr
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
!pqr=apquxz.ixr.zzz.ac.uk
No match
abc!=apquxz.ixr.zzz.ac.uk
No match
abc!pqr=apquxz:ixr.zzz.ac.uk
No match
abc!pqr=apquxz.ixr.zzz.ac.ukk
No match
/:/
Well, we need a colon: somewhere
0: :
2015-09-16 18:49:48 +02:00
\= Expect no match
Fail without a colon
2014-07-24 18:32:38 +02:00
No match
/([\da-f:]+)$/i
0abc
0: 0abc
1: 0abc
abc
0: abc
1: abc
fed
0: fed
1: fed
E
0: E
1: E
::
0: ::
1: ::
5f03:12C0::932e
0: 5f03:12C0::932e
1: 5f03:12C0::932e
fed def
0: def
1: def
Any old stuff
0: ff
1: ff
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
0zzz
No match
gzzz
No match
fed\x20
No match
Any old rubbish
No match
/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
.1.2.3
0: .1.2.3
1: 1
2: 2
3: 3
A.12.123.0
0: A.12.123.0
1: 12
2: 123
3: 0
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
.1.2.3333
No match
1.2.3
No match
1234.2.3
No match
/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
1 IN SOA non-sp1 non-sp2(
0: 1 IN SOA non-sp1 non-sp2(
1: 1
2: non-sp1
3: non-sp2
1 IN SOA non-sp1 non-sp2 (
0: 1 IN SOA non-sp1 non-sp2 (
1: 1
2: non-sp1
3: non-sp2
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1IN SOA non-sp1 non-sp2(
No match
/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
a.
0: a.
Z.
0: Z.
2.
0: 2.
ab-c.pq-r.
0: ab-c.pq-r.
1: .pq-r
sxk.zzz.ac.uk.
0: sxk.zzz.ac.uk.
1: .uk
x-.y-.
0: x-.y-.
1: .y-
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
-abc.peq.
No match
/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
*.a
0: *.a
*.b0-a
0: *.b0-a
1: 0-a
*.c3-b.c
0: *.c3-b.c
1: 3-b
2: .c
*.c-a.b-c
0: *.c-a.b-c
1: -a
2: .b-c
3: -c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
*.0
No match
*.a-
No match
*.a-b.c-
No match
*.c-a.0-c
No match
/^(?=ab(de))(abd)(e)/
abde
0: abde
1: de
2: abd
3: e
/^(?!(ab)de|x)(abd)(f)/
abdf
0: abdf
1: <unset>
2: abd
3: f
/^(?=(ab(cd)))(ab)/
abcd
0: ab
1: abcd
2: cd
3: ab
/^[\da-f](\.[\da-f])*$/i
a.b.c.d
0: a.b.c.d
1: .d
A.B.C.D
0: A.B.C.D
1: .D
a.b.c.1.2.3.C
0: a.b.c.1.2.3.C
1: .C
/^\".*\"\s*(;.*)?$/
\"1234\"
0: "1234"
\"abcd\" ;
0: "abcd" ;
1: ;
\"\" ; rhubarb
0: "" ; rhubarb
1: ; rhubarb
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
\"1234\" : things
No match
/^$/
\
0:
2015-09-16 18:49:48 +02:00
\= Expect no match
A non-empty line
2014-07-24 18:32:38 +02:00
No match
/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
ab c
0: ab c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
ab cde
No match
/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
ab c
0: ab c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
ab cde
No match
/^ a\ b[c ]d $/x
a bcd
0: a bcd
a b d
0: a b d
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcd
No match
ab d
No match
/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
abcdefhijklm
0: abcdefhijklm
1: abc
2: bc
3: c
4: def
5: ef
6: f
7: hij
8: ij
9: j
10: klm
11: lm
12: m
/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
abcdefhijklm
0: abcdefhijklm
1: bc
2: c
3: ef
4: f
5: ij
6: j
7: lm
8: m
/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
a+ Z0+\x08\n\x1d\x12
0: a+ Z0+\x08\x0a\x1d\x12
/^[.^$|()*+?{,}]+/
.^\$(*+)|{?,?}
0: .^$(*+)|{?,?}
/^a*\w/
z
0: z
az
0: az
aaaz
0: aaaz
a
0: a
aa
0: aa
aaaa
0: aaaa
a+
0: a
aa+
0: aa
/^a*?\w/
z
0: z
az
0: a
aaaz
0: a
a
0: a
aa
0: a
aaaa
0: a
a+
0: a
aa+
0: a
/^a+\w/
az
0: az
aaaz
0: aaaz
aa
0: aa
aaaa
0: aaaa
aa+
0: aa
/^a+?\w/
az
0: az
aaaz
0: aa
aa
0: aa
aaaa
0: aa
aa+
0: aa
/^\d{8}\w{2,}/
1234567890
0: 1234567890
12345678ab
0: 12345678ab
12345678__
0: 12345678__
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1234567
No match
/^[aeiou\d]{4,5}$/
uoie
0: uoie
1234
0: 1234
12345
0: 12345
aaaaa
0: aaaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123456
No match
/^[aeiou\d]{4,5}?/
uoie
0: uoie
1234
0: 1234
12345
0: 1234
aaaaa
0: aaaa
123456
0: 1234
/\A(abc|def)=(\1){2,3}\Z/
abc=abcabc
0: abc=abcabc
1: abc
2: abc
def=defdefdef
0: def=defdefdef
1: def
2: def
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc=defdef
No match
/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
abcdefghijkcda2
0: abcdefghijkcda2
1: a
2: b
3: c
4: d
5: e
6: f
7: g
8: h
9: i
10: j
11: k
12: cd
abcdefghijkkkkcda2
0: abcdefghijkkkkcda2
1: a
2: b
3: c
4: d
5: e
6: f
7: g
8: h
9: i
10: j
11: k
12: cd
/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
cataract cataract23
0: cataract cataract23
1: cataract
2: aract
3: ract
4:
5: 3
catatonic catatonic23
0: catatonic catatonic23
1: catatonic
2: atonic
3: tonic
4:
5: 3
caterpillar caterpillar23
0: caterpillar caterpillar23
1: caterpillar
2: erpillar
3: <unset>
4:
5: 3
/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
From abcd Mon Sep 01 12:33:02 1997
0: From abcd Mon Sep 01 12:33
1: abcd
/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
From abcd Mon Sep 01 12:33:02 1997
0: From abcd Mon Sep 01 12:33
1: Sep
From abcd Mon Sep 1 12:33:02 1997
0: From abcd Mon Sep 1 12:33
1: Sep
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
From abcd Sep 01 12:33:02 1997
No match
/^12.34/s
12\n34
0: 12\x0a34
12\r34
0: 12\x0d34
/\w+(?=\t)/
the quick brown\t fox
0: brown
/foo(?!bar)(.*)/
foobar is foolish see?
0: foolish see?
1: lish see?
/(?:(?!foo)...|^.{0,2})bar(.*)/
foobar crowbar etc
0: rowbar etc
1: etc
barrel
0: barrel
1: rel
2barrel
0: 2barrel
1: rel
A barrel
0: A barrel
1: rel
/^(\D*)(?=\d)(?!123)/
abc456
0: abc
1: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc123
No match
/^1234(?# test newlines
inside)/
1234
0: 1234
/^1234 #comment in extended re
/x
1234
0: 1234
/#rhubarb
abcd/x
abcd
0: abcd
/^abcd#rhubarb/x
abcd
0: abcd
/^(a)\1{2,3}(.)/
aaab
0: aaab
1: a
2: b
aaaab
0: aaaab
1: a
2: b
aaaaab
0: aaaaa
1: a
2: a
aaaaaab
0: aaaaa
1: a
2: a
/(?!^)abc/
the abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
/(?=^)abc/
abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
the abc
No match
/^[ab]{1,3}(ab*|b)/
aabbbbb
0: aabb
1: b
/^[ab]{1,3}?(ab*|b)/
aabbbbb
0: aabbbbb
1: abbbbb
/^[ab]{1,3}?(ab*?|b)/
aabbbbb
0: aa
1: a
/^[ab]{1,3}(ab*?|b)/
aabbbbb
0: aabb
1: b
/ (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* # optional leading comment
(?: (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?: # opening quote...
[^\\\x80-\xff\n\015"] # Anything except backslash and quote
| # or
\\ [^\x80-\xff] # Escaped something (something != CR)
)* " # closing quote
) # initial word
(?: (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* \. (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?: # opening quote...
[^\\\x80-\xff\n\015"] # Anything except backslash and quote
| # or
\\ [^\x80-\xff] # Escaped something (something != CR)
)* " # closing quote
) )* # further okay, if led by a period
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* @ (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # initial subdomain
(?: #
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* \. # if led by a period...
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # ...further okay
)*
# address
| # or
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?: # opening quote...
[^\\\x80-\xff\n\015"] # Anything except backslash and quote
| # or
\\ [^\x80-\xff] # Escaped something (something != CR)
)* " # closing quote
) # one word, optionally followed by....
(?:
[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or...
\(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) | # comments, or...
" (?: # opening quote...
[^\\\x80-\xff\n\015"] # Anything except backslash and quote
| # or
\\ [^\x80-\xff] # Escaped something (something != CR)
)* " # closing quote
# quoted strings
)*
< (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* # leading <
(?: @ (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # initial subdomain
(?: #
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* \. # if led by a period...
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # ...further okay
)*
(?: (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* , (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* @ (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # initial subdomain
(?: #
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* \. # if led by a period...
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # ...further okay
)*
)* # further okay, if led by comma
: # closing colon
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* )? # optional route
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?: # opening quote...
[^\\\x80-\xff\n\015"] # Anything except backslash and quote
| # or
\\ [^\x80-\xff] # Escaped something (something != CR)
)* " # closing quote
) # initial word
(?: (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* \. (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
" (?: # opening quote...
[^\\\x80-\xff\n\015"] # Anything except backslash and quote
| # or
\\ [^\x80-\xff] # Escaped something (something != CR)
)* " # closing quote
) )* # further okay, if led by a period
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* @ (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # initial subdomain
(?: #
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* \. # if led by a period...
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* (?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
| \[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
) # ...further okay
)*
# address spec
(?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* > # trailing >
# name and address
) (?: [\040\t] | \(
(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
\) )* # optional trailing comment
/x
Alan Other <user\@dom.ain>
0: Alan Other <user@dom.ain>
<user\@dom.ain>
0: user@dom.ain
user\@dom.ain
0: user@dom.ain
\"A. Other\" <user.1234\@dom.ain> (a comment)
0: "A. Other" <user.1234@dom.ain> (a comment)
A. Other <user.1234\@dom.ain> (a comment)
0: Other <user.1234@dom.ain> (a comment)
\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
A missing angle <user\@some.where
0: user@some.where
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
The quick brown fox
No match
/[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional leading comment
(?:
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
| # or
" # "
[^\\\x80-\xff\n\015"] * # normal
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
" # "
# Quoted string
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
\.
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
| # or
" # "
[^\\\x80-\xff\n\015"] * # normal
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
" # "
# Quoted string
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# additional words
)*
@
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
)*
# address
| # or
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
| # or
" # "
[^\\\x80-\xff\n\015"] * # normal
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
" # "
# Quoted string
)
# leading word
[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces
(?:
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
|
" # "
[^\\\x80-\xff\n\015"] * # normal
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
" # "
) # "special" comment or quoted string
[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal"
)*
<
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# <
(?:
@
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
)*
(?: ,
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
@
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
)*
)* # additional domains
:
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
)? # optional route
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
| # or
" # "
[^\\\x80-\xff\n\015"] * # normal
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
" # "
# Quoted string
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
\.
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
# Atom
| # or
" # "
[^\\\x80-\xff\n\015"] * # normal
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
" # "
# Quoted string
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# additional words
)*
@
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
(?:
\.
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
(?:
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
|
\[ # [
(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
\] # ]
)
[\040\t]* # Nab whitespace.
(?:
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: # (
(?: \\ [^\x80-\xff] |
\( # (
[^\\\x80-\xff\n\015()] * # normal*
(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
\) # )
) # special
[^\\\x80-\xff\n\015()] * # normal*
)* # )*
\) # )
[\040\t]* )* # If comment found, allow more spaces.
# optional trailing comments
)*
# address spec
> # >
# name and address
)
/x
Alan Other <user\@dom.ain>
0: Alan Other <user@dom.ain>
<user\@dom.ain>
0: user@dom.ain
user\@dom.ain
0: user@dom.ain
\"A. Other\" <user.1234\@dom.ain> (a comment)
0: "A. Other" <user.1234@dom.ain>
A. Other <user.1234\@dom.ain> (a comment)
0: Other <user.1234@dom.ain>
\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
A missing angle <user\@some.where
0: user@some.where
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
The quick brown fox
No match
/abc\0def\00pqr\000xyz\0000AB/
abc\0def\00pqr\000xyz\0000AB
0: abc\x00def\x00pqr\x00xyz\x000AB
abc456 abc\0def\00pqr\000xyz\0000ABCDE
0: abc\x00def\x00pqr\x00xyz\x000AB
/abc\x0def\x00pqr\x000xyz\x0000AB/
abc\x0def\x00pqr\x000xyz\x0000AB
0: abc\x0def\x00pqr\x000xyz\x0000AB
abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
0: abc\x0def\x00pqr\x000xyz\x0000AB
/^[\000-\037]/
\0A
0: \x00
\01B
0: \x01
\037C
0: \x1f
/\0*/
\0\0\0\0
0: \x00\x00\x00\x00
/A\x0{2,3}Z/
The A\x0\x0Z
0: A\x00\x00Z
An A\0\x0\0Z
0: A\x00\x00\x00Z
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
A\0Z
No match
A\0\x0\0\x0Z
No match
/^(cow|)\1(bell)/
cowcowbell
0: cowcowbell
1: cow
2: bell
bell
0: bell
1:
2: bell
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
cowbell
No match
/^\s/
\040abc
0:
\x0cabc
0: \x0c
\nabc
0: \x0a
\rabc
0: \x0d
\tabc
0: \x09
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
/^a b
c/x
abc
0: abc
/^(a|)\1*b/
ab
0: ab
1: a
aaaab
0: aaaab
1: a
b
0: b
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
acb
No match
/^(a|)\1+b/
aab
0: aab
1: a
aaaab
0: aaaab
1: a
b
0: b
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
/^(a|)\1?b/
ab
0: ab
1: a
aab
0: aab
1: a
b
0: b
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
acb
No match
/^(a|)\1{2}b/
aaab
0: aaab
1: a
b
0: b
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
aab
No match
aaaab
No match
/^(a|)\1{2,3}b/
aaab
0: aaab
1: a
aaaab
0: aaaab
1: a
b
0: b
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
aab
No match
aaaaab
No match
/ab{1,3}bc/
abbbbc
0: abbbbc
abbbc
0: abbbc
abbc
0: abbc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
abbbbbc
No match
/([^.]*)\.([^:]*):[T ]+(.*)/
track1.title:TBlah blah blah
0: track1.title:TBlah blah blah
1: track1
2: title
3: Blah blah blah
/([^.]*)\.([^:]*):[T ]+(.*)/i
track1.title:TBlah blah blah
0: track1.title:TBlah blah blah
1: track1
2: title
3: Blah blah blah
/([^.]*)\.([^:]*):[t ]+(.*)/i
track1.title:TBlah blah blah
0: track1.title:TBlah blah blah
1: track1
2: title
3: Blah blah blah
/^[W-c]+$/
WXY_^abc
0: WXY_^abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
wxy
No match
/^[W-c]+$/i
WXY_^abc
0: WXY_^abc
wxy_^ABC
0: wxy_^ABC
/^[\x3f-\x5F]+$/i
WXY_^abc
0: WXY_^abc
wxy_^ABC
0: wxy_^ABC
/^abc$/m
abc
0: abc
qqq\nabc
0: abc
abc\nzzz
0: abc
qqq\nabc\nzzz
0: abc
/^abc$/
abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
qqq\nabc
No match
abc\nzzz
No match
qqq\nabc\nzzz
No match
/\Aabc\Z/m
abc
0: abc
abc\n
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
qqq\nabc
No match
abc\nzzz
No match
qqq\nabc\nzzz
No match
/\A(.)*\Z/s
abc\ndef
0: abc\x0adef
1: f
/\A(.)*\Z/m
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\ndef
No match
/(?:b)|(?::+)/
b::c
0: b
c::b
0: ::
/[-az]+/
az-
0: az-
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
b
No match
/[az-]+/
za-
0: za-
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
b
No match
/[a\-z]+/
a-z
0: a-z
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
b
No match
/[a-z]+/
abcdxyz
0: abcdxyz
/[\d-]+/
12-34
0: 12-34
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/[\d-z]+/
12-34z
0: 12-34z
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/\x5c/
\\
0: \
/\x20Z/
the Zoo
0: Z
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Zulu
No match
/(abc)\1/i
abcabc
0: abcabc
1: abc
ABCabc
0: ABCabc
1: ABC
abcABC
0: abcABC
1: abc
/abc$/
abc
0: abc
abc\n
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\ndef
No match
/(abc)\123/
abc\x53
0: abcS
1: abc
/(abc)\223/
abc\x93
0: abc\x93
1: abc
/(abc)\323/
abc\xd3
0: abc\xd3
1: abc
/(abc)\100/
abc\x40
0: abc@
1: abc
abc\100
0: abc@
1: abc
/(abc)\1000/
abc\x400
0: abc@0
1: abc
abc\x40\x30
0: abc@0
1: abc
abc\1000
0: abc@0
1: abc
abc\100\x30
0: abc@0
1: abc
abc\100\060
0: abc@0
1: abc
abc\100\60
0: abc@0
1: abc
/^(A)(B)(C)(D)(E)(F)(G)(H)(I)\8\9$/
ABCDEFGHIHI
0: ABCDEFGHIHI
1: A
2: B
3: C
4: D
5: E
6: F
7: G
8: H
9: I
/^[A\8B\9C]+$/
A8B9C
0: A8B9C
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
A8B9C\x00
No match
/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
abcdefghijkllS
0: abcdefghijkllS
1: a
2: b
3: c
4: d
5: e
6: f
7: g
8: h
9: i
10: j
11: k
12: l
/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
abcdefghijk\12S
0: abcdefghijk\x0aS
1: a
2: b
3: c
4: d
5: e
6: f
7: g
8: h
9: i
10: j
11: k
/a{0}bc/
bc
0: bc
/(a|(bc)){0,0}?xyz/
xyz
0: xyz
/abc[\10]de/
abc\010de
0: abc\x08de
/abc[\1]de/
abc\1de
0: abc\x01de
/(abc)[\1]de/
abc\1de
0: abc\x01de
1: abc
/(?s)a.b/
a\nb
0: a\x0ab
/^([^a])([^\b])([^c]*)([^d]{3,4})/
baNOTccccd
0: baNOTcccc
1: b
2: a
3: NOT
4: cccc
baNOTcccd
0: baNOTccc
1: b
2: a
3: NOT
4: ccc
baNOTccd
0: baNOTcc
1: b
2: a
3: NO
4: Tcc
bacccd
0: baccc
1: b
2: a
3:
4: ccc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
anything
No match
b\bc
No match
baccd
No match
/[^a]/
Abc
0: A
/[^a]/i
Abc
0: b
/[^a]+/
AAAaAbc
0: AAA
/[^a]+/i
AAAaAbc
0: bc
/[^a]+/
bbb\nccc
0: bbb\x0accc
/[^k]$/
abc
0: c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abk
No match
/[^k]{2,3}$/
abc
0: abc
kbc
0: bc
kabc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abk
No match
akb
No match
akk
No match
/^\d{8,}\@.+[^k]$/
12345678\@a.b.c.d
0: 12345678@a.b.c.d
123456789\@x.y.z
0: 123456789@x.y.z
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
12345678\@x.y.uk
No match
1234567\@a.b.c.d
No match
/(a)\1{8,}/
aaaaaaaaa
0: aaaaaaaaa
1: a
aaaaaaaaaa
0: aaaaaaaaaa
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaaa
No match
/[^a]/
aaaabcd
0: b
aaAabcd
0: A
/[^a]/i
aaaabcd
0: b
aaAabcd
0: b
/[^az]/
aaaabcd
0: b
aaAabcd
0: A
/[^az]/i
aaaabcd
0: b
aaAabcd
0: b
/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff
/P[^*]TAIRE[^*]{1,6}?LL/
xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
0: PSTAIREISLL
/P[^*]TAIRE[^*]{1,}?LL/
xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
0: PSTAIREISLL
/(\.\d\d[1-9]?)\d+/
1.230003938
0: .230003938
1: .23
1.875000282
0: .875000282
1: .875
1.235
0: .235
1: .23
/(\.\d\d((?=0)|\d(?=\d)))/
1.230003938
0: .23
1: .23
2:
1.875000282
0: .875
1: .875
2: 5
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1.235
No match
/a(?)b/
ab
0: ab
/\b(foo)\s+(\w+)/i
Food is on the foo table
0: foo table
1: foo
2: table
/foo(.*)bar/
The food is under the bar in the barn.
0: food is under the bar in the bar
1: d is under the bar in the
/foo(.*?)bar/
The food is under the bar in the barn.
0: food is under the bar
1: d is under the
/(.*)(\d*)/
I have 2 numbers: 53147
0: I have 2 numbers: 53147
1: I have 2 numbers: 53147
2:
/(.*)(\d+)/
I have 2 numbers: 53147
0: I have 2 numbers: 53147
1: I have 2 numbers: 5314
2: 7
/(.*?)(\d*)/
I have 2 numbers: 53147
0:
1:
2:
/(.*?)(\d+)/
I have 2 numbers: 53147
0: I have 2
1: I have
2: 2
/(.*)(\d+)$/
I have 2 numbers: 53147
0: I have 2 numbers: 53147
1: I have 2 numbers: 5314
2: 7
/(.*?)(\d+)$/
I have 2 numbers: 53147
0: I have 2 numbers: 53147
1: I have 2 numbers:
2: 53147
/(.*)\b(\d+)$/
I have 2 numbers: 53147
0: I have 2 numbers: 53147
1: I have 2 numbers:
2: 53147
/(.*\D)(\d+)$/
I have 2 numbers: 53147
0: I have 2 numbers: 53147
1: I have 2 numbers:
2: 53147
/^\D*(?!123)/
ABC123
0: AB
/^(\D*)(?=\d)(?!123)/
ABC445
0: ABC
1: ABC
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABC123
No match
/^[W-]46]/
W46]789
0: W46]
-46]789
0: -46]
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Wall
No match
Zebra
No match
42
No match
[abcd]
No match
]abcd[
No match
/^[W-\]46]/
W46]789
0: W
Wall
0: W
Zebra
0: Z
Xylophone
0: X
42
0: 4
[abcd]
0: [
]abcd[
0: ]
\\backslash
0: \
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
-46]789
No match
well
No match
/\d\d\/\d\d\/\d\d\d\d/
01/01/2000
0: 01/01/2000
/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
2015-09-16 18:49:48 +02:00
word cat dog elephant mussel cow horse canary baboon snake shark otherword
2014-07-24 18:32:38 +02:00
0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
2015-09-16 18:49:48 +02:00
\= Expect no match
word cat dog elephant mussel cow horse canary baboon snake shark
2014-07-24 18:32:38 +02:00
No match
/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
2015-09-16 18:49:48 +02:00
\= Expect no match
word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
2014-07-24 18:32:38 +02:00
No match
/^(a){0,0}/
bcd
0:
abc
0:
aab
0:
/^(a){0,1}/
bcd
0:
abc
0: a
1: a
aab
0: a
1: a
/^(a){0,2}/
bcd
0:
abc
0: a
1: a
aab
0: aa
1: a
/^(a){0,3}/
bcd
0:
abc
0: a
1: a
aab
0: aa
1: a
aaa
0: aaa
1: a
/^(a){0,}/
bcd
0:
abc
0: a
1: a
aab
0: aa
1: a
aaa
0: aaa
1: a
aaaaaaaa
0: aaaaaaaa
1: a
/^(a){1,1}/
abc
0: a
1: a
aab
0: a
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bcd
No match
2015-09-16 18:49:48 +02:00
/^(a){1,2}/
2014-07-24 18:32:38 +02:00
abc
0: a
1: a
aab
0: aa
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bcd
No match
2015-09-16 18:49:48 +02:00
/^(a){1,3}/
2014-07-24 18:32:38 +02:00
abc
0: a
1: a
aab
0: aa
1: a
aaa
0: aaa
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bcd
No match
2015-09-16 18:49:48 +02:00
/^(a){1,}/
2014-07-24 18:32:38 +02:00
abc
0: a
1: a
aab
0: aa
1: a
aaa
0: aaa
1: a
aaaaaaaa
0: aaaaaaaa
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
bcd
No match
2014-07-24 18:32:38 +02:00
/.*\.gif/
borfle\nbib.gif\nno
0: bib.gif
/.{0,}\.gif/
borfle\nbib.gif\nno
0: bib.gif
/.*\.gif/m
borfle\nbib.gif\nno
0: bib.gif
/.*\.gif/s
borfle\nbib.gif\nno
0: borfle\x0abib.gif
/.*\.gif/ms
borfle\nbib.gif\nno
0: borfle\x0abib.gif
/.*$/
borfle\nbib.gif\nno
0: no
/.*$/m
borfle\nbib.gif\nno
0: borfle
/.*$/s
borfle\nbib.gif\nno
0: borfle\x0abib.gif\x0ano
/.*$/ms
borfle\nbib.gif\nno
0: borfle\x0abib.gif\x0ano
/.*$/
borfle\nbib.gif\nno\n
0: no
/.*$/m
borfle\nbib.gif\nno\n
0: borfle
/.*$/s
borfle\nbib.gif\nno\n
0: borfle\x0abib.gif\x0ano\x0a
/.*$/ms
borfle\nbib.gif\nno\n
0: borfle\x0abib.gif\x0ano\x0a
/(.*X|^B)/
abcde\n1234Xyz
0: 1234X
1: 1234X
BarFoo
0: B
1: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcde\nBar
No match
/(.*X|^B)/m
abcde\n1234Xyz
0: 1234X
1: 1234X
BarFoo
0: B
1: B
abcde\nBar
0: B
1: B
/(.*X|^B)/s
abcde\n1234Xyz
0: abcde\x0a1234X
1: abcde\x0a1234X
BarFoo
0: B
1: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcde\nBar
No match
/(.*X|^B)/ms
abcde\n1234Xyz
0: abcde\x0a1234X
1: abcde\x0a1234X
BarFoo
0: B
1: B
abcde\nBar
0: B
1: B
/(?s)(.*X|^B)/
abcde\n1234Xyz
0: abcde\x0a1234X
1: abcde\x0a1234X
BarFoo
0: B
1: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcde\nBar
No match
/(?s:.*X|^B)/
abcde\n1234Xyz
0: abcde\x0a1234X
BarFoo
0: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcde\nBar
No match
/^.*B/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\nB
No match
/(?s)^.*B/
abc\nB
0: abc\x0aB
/(?m)^.*B/
abc\nB
0: B
/(?ms)^.*B/
abc\nB
0: abc\x0aB
/(?ms)^B/
abc\nB
0: B
/(?s)B$/
B\n
0: B
/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
123456654321
0: 123456654321
/^\d\d\d\d\d\d\d\d\d\d\d\d/
123456654321
0: 123456654321
/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
123456654321
0: 123456654321
/^[abc]{12}/
abcabcabcabc
0: abcabcabcabc
/^[a-c]{12}/
abcabcabcabc
0: abcabcabcabc
/^(a|b|c){12}/
abcabcabcabc
0: abcabcabcabc
1: c
/^[abcdefghijklmnopqrstuvwxy0123456789]/
n
0: n
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
z
No match
/abcde{0,0}/
abcd
0: abcd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abce
No match
/ab[cd]{0,0}e/
abe
0: abe
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcde
No match
/ab(c){0,0}d/
abd
0: abd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcd
No match
/a(b*)/
a
0: a
1:
ab
0: ab
1: b
abbbb
0: abbbb
1: bbbb
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bbbbb
No match
/ab\d{0}e/
abe
0: abe
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab1e
No match
/"([^\\"]+|\\.)*"/
the \"quick\" brown fox
0: "quick"
1: quick
\"the \\\"quick\\\" brown fox\"
0: "the \"quick\" brown fox"
1: brown fox
/.*?/g,aftertext
abc
0:
0+ abc
0: a
0+ bc
0:
0+ bc
0: b
0+ c
0:
0+ c
0: c
0+
0:
0+
/\b/g,aftertext
abc
0:
0+ abc
0:
0+
/\b/g,aftertext
abc
0:
0+ abc
0:
0+
//g
abc
0:
0:
0:
0:
/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
<TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
1: BGCOLOR='#DBE9E9'
2: align=left valign=top
3: 43.
4: <a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)
5:
6:
7: <unset>
8: align=left valign=top
9: Lega lstaff.com
10: align=left valign=top
11: CA - Statewide
/a[^a]b/
acb
0: acb
a\nb
0: a\x0ab
/a.b/
acb
0: acb
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a\nb
No match
/a[^a]b/s
acb
0: acb
a\nb
0: a\x0ab
/a.b/s
acb
0: acb
a\nb
0: a\x0ab
/^(b+?|a){1,2}?c/
bac
0: bac
1: a
bbac
0: bbac
1: a
bbbac
0: bbbac
1: a
bbbbac
0: bbbbac
1: a
bbbbbac
0: bbbbbac
1: a
/^(b+|a){1,2}?c/
bac
0: bac
1: a
bbac
0: bbac
1: a
bbbac
0: bbbac
1: a
bbbbac
0: bbbbac
1: a
bbbbbac
0: bbbbbac
1: a
/(?!\A)x/m
2015-09-16 18:49:48 +02:00
a\bx\n
0: x
a\nx\n
0: x
\= Expect no match
2014-07-24 18:32:38 +02:00
x\nb\n
No match
/(A|B)*?CD/
CD
0: CD
/(A|B)*CD/
CD
0: CD
/(AB)*?\1/
ABABAB
0: ABAB
1: AB
/(AB)*\1/
ABABAB
0: ABABAB
1: AB
/(?<!bar)foo/
foo
0: foo
catfood
0: foo
arfootle
0: foo
rfoosh
0: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
barfoo
No match
towbarfoo
No match
/\w{3}(?<!bar)foo/
catfood
0: catfoo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
foo
No match
barfoo
No match
towbarfoo
No match
/(?<=(foo)a)bar/
fooabar
0: bar
1: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bar
No match
foobbar
No match
/\Aabc\z/m
abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\n
No match
qqq\nabc
No match
abc\nzzz
No match
qqq\nabc\nzzz
No match
"(?>.*/)foo"
/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
2015-09-16 18:49:48 +02:00
\= Expect no match
/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
No match
2014-07-24 18:32:38 +02:00
/(?>(\.\d\d[1-9]?))\d+/
1.230003938
0: .230003938
1: .23
1.875000282
0: .875000282
1: .875
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1.235
No match
/^((?>\w+)|(?>\s+))*$/
now is the time for all good men to come to the aid of the party
0: now is the time for all good men to come to the aid of the party
1: party
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
this is not a line with only words and spaces!
No match
/(\d+)(\w)/
12345a
0: 12345a
1: 12345
2: a
12345+
0: 12345
1: 1234
2: 5
/((?>\d+))(\w)/
12345a
0: 12345a
1: 12345
2: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
12345+
No match
/(?>a+)b/
aaab
0: aaab
/((?>a+)b)/
aaab
0: aaab
1: aaab
/(?>(a+))b/
aaab
0: aaab
1: aaa
/(?>b)+/
aaabbbccc
0: bbb
/(?>a+|b+|c+)*c/
aaabbbbccccd
0: aaabbbbc
/((?>[^()]+)|\([^()]*\))+/
((abc(ade)ufh()()x
0: abc(ade)ufh()()x
1: x
/\(((?>[^()]+)|\([^()]+\))+\)/
(abc)
0: (abc)
1: abc
(abc(def)xyz)
0: (abc(def)xyz)
1: xyz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
/a(?-i)b/i
ab
0: ab
Ab
0: Ab
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aB
No match
AB
No match
/(a (?x)b c)d e/
a bcd e
0: a bcd e
1: a bc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a b cd e
No match
abcd e
No match
a bcde
No match
/(a b(?x)c d (?-x)e f)/
a bcde f
0: a bcde f
1: a bcde f
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcdef
No match
/(a(?i)b)c/
abc
0: abc
1: ab
aBc
0: aBc
1: aB
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abC
No match
aBC
No match
Abc
No match
ABc
No match
ABC
No match
AbC
No match
/a(?i:b)c/
abc
0: abc
aBc
0: aBc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABC
No match
abC
No match
aBC
No match
/a(?i:b)*c/
aBc
0: aBc
aBBc
0: aBBc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aBC
No match
aBBC
No match
/a(?=b(?i)c)\w\wd/
abcd
0: abcd
abCd
0: abCd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aBCd
No match
abcD
No match
/(?s-i:more.*than).*million/i
more than million
0: more than million
more than MILLION
0: more than MILLION
more \n than Million
0: more \x0a than Million
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
MORE THAN MILLION
No match
more \n than \n million
No match
/(?:(?s-i)more.*than).*million/i
more than million
0: more than million
more than MILLION
0: more than MILLION
more \n than Million
0: more \x0a than Million
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
MORE THAN MILLION
No match
more \n than \n million
No match
/(?>a(?i)b+)+c/
abc
0: abc
aBbc
0: aBbc
aBBc
0: aBBc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Abc
No match
abAb
No match
abbC
No match
/(?=a(?i)b)\w\wc/
abc
0: abc
aBc
0: aBc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Ab
No match
abC
No match
aBC
No match
/(?<=a(?i)b)(\w\w)c/
abxxc
0: xxc
1: xx
aBxxc
0: xxc
1: xx
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Abxxc
No match
ABxxc
No match
abxxC
No match
/(?:(a)|b)(?(1)A|B)/
aA
0: aA
1: a
bB
0: bB
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aB
No match
bA
No match
/^(a)?(?(1)a|b)+$/
aa
0: aa
1: a
b
0: b
bb
0: bb
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
# Perl gets this next one wrong if the pattern ends with $; in that case it
# fails to match "12".
/^(?(?=abc)\w{3}:|\d\d)/
abc:
0: abc:
12
0: 12
123
0: 12
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyz
No match
/^(?(?!abc)\d\d|\w{3}:)$/
abc:
0: abc:
12
0: 12
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123
No match
xyz
No match
/(?(?<=foo)bar|cat)/
foobar
0: bar
cat
0: cat
fcat
0: cat
focat
0: cat
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
foocat
No match
/(?(?<!foo)cat|bar)/
foobar
0: bar
cat
0: cat
fcat
0: cat
focat
0: cat
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
foocat
No match
/( \( )? [^()]+ (?(1) \) |) /x
abcd
0: abcd
(abcd)
0: (abcd)
1: (
the quick (abcd) fox
0: the quick
(abcd
0: abcd
/( \( )? [^()]+ (?(1) \) ) /x
abcd
0: abcd
(abcd)
0: (abcd)
1: (
the quick (abcd) fox
0: the quick
(abcd
0: abcd
/^(?(2)a|(1)(2))+$/
12
0: 12
1: 1
2: 2
12a
0: 12a
1: 1
2: 2
12aa
0: 12aa
1: 1
2: 2
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1234
No match
/((?i)blah)\s+\1/
blah blah
0: blah blah
1: blah
BLAH BLAH
0: BLAH BLAH
1: BLAH
Blah Blah
0: Blah Blah
1: Blah
blaH blaH
0: blaH blaH
1: blaH
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
blah BLAH
No match
Blah blah
No match
blaH blah
No match
/((?i)blah)\s+(?i:\1)/
blah blah
0: blah blah
1: blah
BLAH BLAH
0: BLAH BLAH
1: BLAH
Blah Blah
0: Blah Blah
1: Blah
blaH blaH
0: blaH blaH
1: blaH
blah BLAH
0: blah BLAH
1: blah
Blah blah
0: Blah blah
1: Blah
blaH blah
0: blaH blah
1: blaH
/(?>a*)*/
a
0: a
aa
0: aa
aaaa
0: aaaa
/(abc|)+/
abc
0: abc
1:
abcabc
0: abcabc
1:
abcabcabc
0: abcabcabc
1:
xyz
0:
1:
/([a]*)*/
a
0: a
1:
aaaaa
0: aaaaa
1:
/([ab]*)*/
a
0: a
1:
b
0: b
1:
ababab
0: ababab
1:
aaaabcde
0: aaaab
1:
bbbb
0: bbbb
1:
/([^a]*)*/
b
0: b
1:
bbbb
0: bbbb
1:
aaa
0:
1:
/([^ab]*)*/
cccc
0: cccc
1:
abab
0:
1:
/([a]*?)*/
a
0:
1:
aaaa
0:
1:
/([ab]*?)*/
a
0:
1:
b
0:
1:
abab
0:
1:
baba
0:
1:
/([^a]*?)*/
b
0:
1:
bbbb
0:
1:
aaa
0:
1:
/([^ab]*?)*/
c
0:
1:
cccc
0:
1:
baba
0:
1:
/(?>a*)*/
a
0: a
aaabcde
0: aaa
/((?>a*))*/
aaaaa
0: aaaaa
1:
aabbaa
0: aa
1:
/((?>a*?))*/
aaaaa
0:
1:
aabbaa
0:
1:
/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x
12-sep-98
0: 12-sep-98
12-09-98
0: 12-09-98
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
sep-12-98
No match
/(?<=(foo))bar\1/
foobarfoo
0: barfoo
1: foo
foobarfootling
0: barfoo
1: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
foobar
No match
barfoo
No match
/(?i:saturday|sunday)/
saturday
0: saturday
sunday
0: sunday
Saturday
0: Saturday
Sunday
0: Sunday
SATURDAY
0: SATURDAY
SUNDAY
0: SUNDAY
SunDay
0: SunDay
/(a(?i)bc|BB)x/
abcx
0: abcx
1: abc
aBCx
0: aBCx
1: aBC
bbx
0: bbx
1: bb
BBx
0: BBx
1: BB
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcX
No match
aBCX
No match
bbX
No match
BBX
No match
/^([ab](?i)[cd]|[ef])/
ac
0: ac
1: ac
aC
0: aC
1: aC
bD
0: bD
1: bD
elephant
0: e
1: e
Europe
0: E
1: E
frog
0: f
1: f
France
0: F
1: F
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Africa
No match
/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
ab
0: ab
1: ab
aBd
0: aBd
1: aBd
xy
0: xy
1: xy
xY
0: xY
1: xY
zebra
0: z
1: z
Zambesi
0: Z
1: Z
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aCD
No match
XY
No match
/(?<=foo\n)^bar/m
foo\nbar
0: bar
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bar
No match
baz\nbar
No match
/(?<=(?<!foo)bar)baz/
barbaz
0: baz
barbarbaz
0: baz
koobarbaz
0: baz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
baz
No match
foobarbaz
No match
2015-09-16 18:49:48 +02:00
# The cases of aaaa and aaaaaa are missed out below because Perl does things
# differently. We know that odd, and maybe incorrect, things happen with
# recursive references in Perl, as far as 5.11.3 - see some stuff in test #2.
2014-07-24 18:32:38 +02:00
/^(a\1?){4}$/
aaaaa
0: aaaaa
1: a
aaaaaaa
0: aaaaaaa
1: a
2015-09-16 18:49:48 +02:00
aaaaaaaaaa
0: aaaaaaaaaa
1: aaaa
\= Expect no match
a
No match
aa
No match
aaa
No match
2014-07-24 18:32:38 +02:00
aaaaaaaa
No match
aaaaaaaaa
No match
aaaaaaaaaaa
No match
aaaaaaaaaaaa
No match
aaaaaaaaaaaaa
No match
aaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaa
No match
2015-09-16 18:49:48 +02:00
aaaaaaaaaaaaaaaa
2014-07-24 18:32:38 +02:00
No match
/^(a\1?)(a\1?)(a\2?)(a\3?)$/
aaaa
0: aaaa
1: a
2: a
3: a
4: a
aaaaa
0: aaaaa
1: a
2: aa
3: a
4: a
aaaaaa
0: aaaaaa
1: a
2: aa
3: a
4: aa
aaaaaaa
0: aaaaaaa
1: a
2: aa
3: aaa
4: a
aaaaaaaaaa
0: aaaaaaaaaa
1: a
2: aa
3: aaa
4: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
a
No match
aa
No match
aaa
No match
aaaaaaaa
No match
aaaaaaaaa
No match
2014-07-24 18:32:38 +02:00
aaaaaaaaaaa
No match
aaaaaaaaaaaa
No match
aaaaaaaaaaaaa
No match
aaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaaa
No match
2015-09-16 18:49:48 +02:00
# The following tests are taken from the Perl 5.005 test suite; some of them
# are compatible with 5.004, but I'd rather not have to sort them out.
2014-07-24 18:32:38 +02:00
/abc/
abc
0: abc
xabcy
0: abc
ababc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xbc
No match
axc
No match
abx
No match
/ab*c/
abc
0: abc
/ab*bc/
abc
0: abc
abbc
0: abbc
abbbbc
0: abbbbc
/.{1}/
abbbbc
0: a
/.{3,4}/
abbbbc
0: abbb
/ab{0,}bc/
abbbbc
0: abbbbc
/ab+bc/
abbc
0: abbc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
abq
No match
/ab{1,}bc/
/ab+bc/
abbbbc
0: abbbbc
/ab{1,}bc/
abbbbc
0: abbbbc
/ab{1,3}bc/
abbbbc
0: abbbbc
/ab{3,4}bc/
abbbbc
0: abbbbc
/ab{4,5}bc/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abq
No match
abbbbc
No match
/ab?bc/
abbc
0: abbc
abc
0: abc
/ab{0,1}bc/
abc
0: abc
/ab?bc/
/ab?c/
abc
0: abc
/ab{0,1}c/
abc
0: abc
/^abc$/
abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abbbbc
No match
abcc
No match
/^abc/
abcc
0: abc
/^abc$/
/abc$/
aabc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabcd
No match
/^/
abc
0:
/$/
abc
0:
/a.c/
abc
0: abc
axc
0: axc
/a.*c/
axyzc
0: axyzc
/a[bc]d/
abd
0: abd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
axyzd
No match
abc
No match
/a[b-d]e/
ace
0: ace
/a[b-d]/
aac
0: ac
/a[-b]/
a-
0: a-
/a[b-]/
a-
0: a-
/a]/
a]
0: a]
/a[]]b/
a]b
0: a]b
/a[^bc]d/
aed
0: aed
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abd
No match
abd
No match
/a[^-b]c/
adc
0: adc
/a[^]b]c/
adc
0: adc
a-c
0: a-c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a]c
No match
/\ba\b/
a-
0: a
-a
0: a
-a-
0: a
/\by\b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xy
No match
yz
No match
xyz
No match
/\Ba\B/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a-
No match
-a
No match
-a-
No match
/\By\b/
xy
0: y
/\by\B/
yz
0: y
/\By\B/
xyz
0: y
/\w/
a
0: a
/\W/
-
0: -
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
/a\sb/
a b
0: a b
/a\Sb/
a-b
0: a-b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a b
No match
/\d/
1
0: 1
/\D/
-
0: -
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1
No match
/[\w]/
a
0: a
/[\W]/
-
0: -
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
/a[\s]b/
a b
0: a b
/a[\S]b/
a-b
0: a-b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a b
No match
/[\d]/
1
0: 1
/[\D]/
-
0: -
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1
No match
/ab|cd/
abc
0: ab
abcd
0: ab
/()ef/
def
0: ef
1:
/$b/
/a\(b/
a(b
0: a(b
/a\(*b/
ab
0: ab
a((b
0: a((b
/a\\b/
a\\b
0: a\b
/((a))/
abc
0: a
1: a
2: a
/(a)b(c)/
abc
0: abc
1: a
2: c
/a+b+c/
aabbabc
0: abc
/a{1,}b{1,}c/
aabbabc
0: abc
/a.+?c/
abcabc
0: abc
/(a+|b)*/
ab
0: ab
1: b
/(a+|b){0,}/
ab
0: ab
1: b
/(a+|b)+/
ab
0: ab
1: b
/(a+|b){1,}/
ab
0: ab
1: b
/(a+|b)?/
ab
0: a
1: a
/(a+|b){0,1}/
ab
0: a
1: a
/[^ab]*/
cde
0: cde
/abc/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
b
No match
/a*/
2015-09-16 18:49:48 +02:00
\
0:
2014-07-24 18:32:38 +02:00
/([abc])*d/
abbbcd
0: abbbcd
1: c
/([abc])*bcd/
abcd
0: abcd
1: a
/a|b|c|d|e/
e
0: e
/(a|b|c|d|e)f/
ef
0: ef
1: e
/abcd*efg/
abcdefg
0: abcdefg
/ab*/
xabyabbbz
0: ab
xayabbbz
0: a
/(ab|cd)e/
abcde
0: cde
1: cd
/[abhgefdc]ij/
hij
0: hij
/^(ab|cd)e/
/(abc|)ef/
abcdef
0: ef
1:
/(a|b)c*d/
abcd
0: bcd
1: b
/(ab|ab*)bc/
abc
0: abc
1: a
/a([bc]*)c*/
abc
0: abc
1: bc
/a([bc]*)(c*d)/
abcd
0: abcd
1: bc
2: d
/a([bc]+)(c*d)/
abcd
0: abcd
1: bc
2: d
/a([bc]*)(c+d)/
abcd
0: abcd
1: b
2: cd
/a[bcd]*dcdcde/
adcdcde
0: adcdcde
/a[bcd]+dcdcde/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcde
No match
adcdcde
No match
/(ab|a)b*c/
abc
0: abc
1: ab
/((a)(b)c)(d)/
abcd
0: abcd
1: abc
2: a
3: b
4: d
/[a-zA-Z_][a-zA-Z0-9_]*/
alpha
0: alpha
/^a(bc+|b[eh])g|.h$/
abh
0: bh
/(bc+d$|ef*g.|h?i(j|k))/
effgz
0: effgz
1: effgz
ij
0: ij
1: ij
2: j
reffgz
0: effgz
1: effgz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
effg
No match
bcdd
No match
/((((((((((a))))))))))/
a
0: a
1: a
2: a
3: a
4: a
5: a
6: a
7: a
8: a
9: a
10: a
/((((((((((a))))))))))\10/
aa
0: aa
1: a
2: a
3: a
4: a
5: a
6: a
7: a
8: a
9: a
10: a
/(((((((((a)))))))))/
a
0: a
1: a
2: a
3: a
4: a
5: a
6: a
7: a
8: a
9: a
/multiple words of text/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aa
No match
uh-uh
No match
/multiple words/
multiple words, yeah
0: multiple words
/(.*)c(.*)/
abcde
0: abcde
1: ab
2: de
/\((.*), (.*)\)/
(a, b)
0: (a, b)
1: a
2: b
/[k]/
/abcd/
abcd
0: abcd
/a(bc)d/
abcd
0: abcd
1: bc
/a[-]?c/
ac
0: ac
/(abc)\1/
abcabc
0: abcabc
1: abc
/([a-c]*)\1/
abcabc
0: abcabc
1: abc
/(a)|\1/
a
0: a
1: a
ab
0: a
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
x
No match
/(([a-c])b*?\2)*/
ababbbcbc
0: ababb
1: bb
2: b
/(([a-c])b*?\2){3}/
ababbbcbc
0: ababbbcbc
1: cbc
2: c
/((\3|b)\2(a)x)+/
aaaxabaxbaaxbbax
0: bbax
1: bbax
2: b
3: a
/((\3|b)\2(a)){2,}/
bbaababbabaaaaabbaaaabba
0: bbaaaabba
1: bba
2: b
3: a
/abc/i
ABC
0: ABC
XABCY
0: ABC
ABABC
0: ABC
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaxabxbaxbbx
No match
XBC
No match
AXC
No match
ABX
No match
/ab*c/i
ABC
0: ABC
/ab*bc/i
ABC
0: ABC
ABBC
0: ABBC
/ab*?bc/i
ABBBBC
0: ABBBBC
/ab{0,}?bc/i
ABBBBC
0: ABBBBC
/ab+?bc/i
ABBC
0: ABBC
/ab+bc/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABC
No match
ABQ
No match
/ab{1,}bc/i
/ab+bc/i
ABBBBC
0: ABBBBC
/ab{1,}?bc/i
ABBBBC
0: ABBBBC
/ab{1,3}?bc/i
ABBBBC
0: ABBBBC
/ab{3,4}?bc/i
ABBBBC
0: ABBBBC
/ab{4,5}?bc/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABQ
No match
ABBBBC
No match
/ab??bc/i
ABBC
0: ABBC
ABC
0: ABC
/ab{0,1}?bc/i
ABC
0: ABC
/ab??bc/i
/ab??c/i
ABC
0: ABC
/ab{0,1}?c/i
ABC
0: ABC
/^abc$/i
ABC
0: ABC
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABBBBC
No match
ABCC
No match
/^abc/i
ABCC
0: ABC
/^abc$/i
/abc$/i
AABC
0: ABC
/^/i
ABC
0:
/$/i
ABC
0:
/a.c/i
ABC
0: ABC
AXC
0: AXC
/a.*?c/i
AXYZC
0: AXYZC
/a.*c/i
AABC
0: AABC
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AXYZD
No match
/a[bc]d/i
ABD
0: ABD
/a[b-d]e/i
ACE
0: ACE
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABC
No match
ABD
No match
/a[b-d]/i
AAC
0: AC
/a[-b]/i
A-
0: A-
/a[b-]/i
A-
0: A-
/a]/i
A]
0: A]
/a[]]b/i
A]B
0: A]B
/a[^bc]d/i
AED
0: AED
/a[^-b]c/i
ADC
0: ADC
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABD
No match
A-C
No match
/a[^]b]c/i
ADC
0: ADC
/ab|cd/i
ABC
0: AB
ABCD
0: AB
/()ef/i
DEF
0: EF
1:
/$b/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
A]C
No match
B
No match
/a\(b/i
A(B
0: A(B
/a\(*b/i
AB
0: AB
A((B
0: A((B
/a\\b/i
A\\b
0: A\b
a\\B
0: a\B
/((a))/i
ABC
0: A
1: A
2: A
/(a)b(c)/i
ABC
0: ABC
1: A
2: C
/a+b+c/i
AABBABC
0: ABC
/a{1,}b{1,}c/i
AABBABC
0: ABC
/a.+?c/i
ABCABC
0: ABC
/a.*?c/i
ABCABC
0: ABC
/a.{0,5}?c/i
ABCABC
0: ABC
/(a+|b)*/i
AB
0: AB
1: B
/(a+|b){0,}/i
AB
0: AB
1: B
/(a+|b)+/i
AB
0: AB
1: B
/(a+|b){1,}/i
AB
0: AB
1: B
/(a+|b)?/i
AB
0: A
1: A
/(a+|b){0,1}/i
AB
0: A
1: A
/(a+|b){0,1}?/i
AB
0:
/[^ab]*/i
CDE
0: CDE
/([abc])*d/i
ABBBCD
0: ABBBCD
1: C
/([abc])*bcd/i
ABCD
0: ABCD
1: A
/a|b|c|d|e/i
E
0: E
/(a|b|c|d|e)f/i
EF
0: EF
1: E
/abcd*efg/i
ABCDEFG
0: ABCDEFG
/ab*/i
XABYABBBZ
0: AB
XAYABBBZ
0: A
/(ab|cd)e/i
ABCDE
0: CDE
1: CD
/[abhgefdc]ij/i
HIJ
0: HIJ
/^(ab|cd)e/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABCDE
No match
/(abc|)ef/i
ABCDEF
0: EF
1:
/(a|b)c*d/i
ABCD
0: BCD
1: B
/(ab|ab*)bc/i
ABC
0: ABC
1: A
/a([bc]*)c*/i
ABC
0: ABC
1: BC
/a([bc]*)(c*d)/i
ABCD
0: ABCD
1: BC
2: D
/a([bc]+)(c*d)/i
ABCD
0: ABCD
1: BC
2: D
/a([bc]*)(c+d)/i
ABCD
0: ABCD
1: B
2: CD
/a[bcd]*dcdcde/i
ADCDCDE
0: ADCDCDE
/a[bcd]+dcdcde/i
/(ab|a)b*c/i
ABC
0: ABC
1: AB
/((a)(b)c)(d)/i
ABCD
0: ABCD
1: ABC
2: A
3: B
4: D
/[a-zA-Z_][a-zA-Z0-9_]*/i
ALPHA
0: ALPHA
/^a(bc+|b[eh])g|.h$/i
ABH
0: BH
/(bc+d$|ef*g.|h?i(j|k))/i
EFFGZ
0: EFFGZ
1: EFFGZ
IJ
0: IJ
1: IJ
2: J
REFFGZ
0: EFFGZ
1: EFFGZ
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ADCDCDE
No match
EFFG
No match
BCDD
No match
/((((((((((a))))))))))/i
A
0: A
1: A
2: A
3: A
4: A
5: A
6: A
7: A
8: A
9: A
10: A
/((((((((((a))))))))))\10/i
AA
0: AA
1: A
2: A
3: A
4: A
5: A
6: A
7: A
8: A
9: A
10: A
/(((((((((a)))))))))/i
A
0: A
1: A
2: A
3: A
4: A
5: A
6: A
7: A
8: A
9: A
/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
A
0: A
1: A
/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
C
0: C
1: C
/multiple words of text/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AA
No match
UH-UH
No match
/multiple words/i
MULTIPLE WORDS, YEAH
0: MULTIPLE WORDS
/(.*)c(.*)/i
ABCDE
0: ABCDE
1: AB
2: DE
/\((.*), (.*)\)/i
(A, B)
0: (A, B)
1: A
2: B
/[k]/i
/abcd/i
ABCD
0: ABCD
/a(bc)d/i
ABCD
0: ABCD
1: BC
/a[-]?c/i
AC
0: AC
/(abc)\1/i
ABCABC
0: ABCABC
1: ABC
/([a-c]*)\1/i
ABCABC
0: ABCABC
1: ABC
/a(?!b)./
abad
0: ad
/a(?=d)./
abad
0: ad
/a(?=c|d)./
abad
0: ad
/a(?:b|c|d)(.)/
ace
0: ace
1: e
/a(?:b|c|d)*(.)/
ace
0: ace
1: e
/a(?:b|c|d)+?(.)/
ace
0: ace
1: e
acdbcdbe
0: acd
1: d
/a(?:b|c|d)+(.)/
acdbcdbe
0: acdbcdbe
1: e
/a(?:b|c|d){2}(.)/
acdbcdbe
0: acdb
1: b
/a(?:b|c|d){4,5}(.)/
acdbcdbe
0: acdbcdb
1: b
/a(?:b|c|d){4,5}?(.)/
acdbcdbe
0: acdbcd
1: d
/((foo)|(bar))*/
foobar
0: foobar
1: bar
2: foo
3: bar
/a(?:b|c|d){6,7}(.)/
acdbcdbe
0: acdbcdbe
1: e
/a(?:b|c|d){6,7}?(.)/
acdbcdbe
0: acdbcdbe
1: e
/a(?:b|c|d){5,6}(.)/
acdbcdbe
0: acdbcdbe
1: e
/a(?:b|c|d){5,6}?(.)/
acdbcdbe
0: acdbcdb
1: b
/a(?:b|c|d){5,7}(.)/
acdbcdbe
0: acdbcdbe
1: e
/a(?:b|c|d){5,7}?(.)/
acdbcdbe
0: acdbcdb
1: b
/a(?:b|(c|e){1,2}?|d)+?(.)/
ace
0: ace
1: c
2: e
/^(.+)?B/
AB
0: AB
1: A
/^([^a-z])|(\^)$/
.
0: .
1: .
/^[<>]&/
<&OUT
0: <&
/^(a\1?){4}$/
aaaaaaaaaa
0: aaaaaaaaaa
1: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AB
No match
aaaaaaaaa
No match
aaaaaaaaaaa
No match
/^(a(?(1)\1)){4}$/
aaaaaaaaaa
0: aaaaaaaaaa
1: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaaaaa
No match
aaaaaaaaaaa
No match
/(?:(f)(o)(o)|(b)(a)(r))*/
foobar
0: foobar
1: f
2: o
3: o
4: b
5: a
6: r
/(?<=a)b/
ab
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
cb
No match
b
No match
/(?<!c)b/
ab
0: b
b
0: b
b
0: b
/(?:..)*a/
aba
0: aba
/(?:..)*?a/
aba
0: a
/^(?:b|a(?=(.)))*\1/
abc
0: ab
1: b
/^(){3,5}/
abc
0:
1:
/^(a+)*ax/
aax
0: aax
1: a
/^((a|b)+)*ax/
aax
0: aax
1: a
2: a
/^((a|bc)+)*ax/
aax
0: aax
1: a
2: a
/(a|x)*ab/
cab
0: ab
/(a)*ab/
cab
0: ab
/(?:(?i)a)b/
ab
0: ab
/((?i)a)b/
ab
0: ab
1: a
/(?:(?i)a)b/
Ab
0: Ab
/((?i)a)b/
Ab
0: Ab
1: A
/(?:(?i)a)b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
cb
No match
aB
No match
/((?i)a)b/
/(?i:a)b/
ab
0: ab
/((?i:a))b/
ab
0: ab
1: a
/(?i:a)b/
Ab
0: Ab
/((?i:a))b/
Ab
0: Ab
1: A
/(?i:a)b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aB
No match
aB
No match
/((?i:a))b/
/(?:(?-i)a)b/i
ab
0: ab
/((?-i)a)b/i
ab
0: ab
1: a
/(?:(?-i)a)b/i
aB
0: aB
/((?-i)a)b/i
aB
0: aB
1: a
/(?:(?-i)a)b/i
aB
0: aB
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Ab
No match
AB
No match
/(?-i:a)b/i
ab
0: ab
/((?-i:a))b/i
ab
0: ab
1: a
/(?-i:a)b/i
aB
0: aB
/((?-i:a))b/i
aB
0: aB
1: a
/(?-i:a)b/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AB
No match
Ab
No match
/((?-i:a))b/i
/(?-i:a)b/i
aB
0: aB
/((?-i:a))b/i
aB
0: aB
1: a
/(?-i:a)b/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Ab
No match
AB
No match
/((?-i:a))b/i
/((?-i:a.))b/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AB
No match
a\nB
No match
/((?s-i:a.))b/i
a\nB
0: a\x0aB
1: a\x0a
/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
cabbbb
0: cabbbb
/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
/(ab)\d\1/i
Ab4ab
0: Ab4ab
1: Ab
ab4Ab
0: ab4Ab
1: ab
/foo\w*\d{4}baz/
foobar1234baz
0: foobar1234baz
/x(~~)*(?:(?:F)?)?/
x~~
0: x~~
1: ~~
/^a(?#xxx){3}c/
aaac
0: aaac
/^a (?#xxx) (?#yyy) {3}c/x
aaac
0: aaac
/(?<![cd])b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
B\nB
No match
dbcb
No match
/(?<![cd])[ab]/
dbaacb
0: a
/(?<!(c|d))b/
/(?<!(c|d))[ab]/
dbaacb
0: a
/(?<!cd)[ab]/
cdaccb
0: b
/^(?:a?b?)*$/
\
0:
a
0: a
ab
0: ab
aaa
0: aaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
dbcb
No match
a--
No match
aa--
No match
/((?s)^a(.))((?m)^b$)/
a\nb\nc\n
0: a\x0ab
1: a\x0a
2: \x0a
3: b
/((?m)^b$)/
a\nb\nc\n
0: b
1: b
/(?m)^b/
a\nb\n
0: b
/(?m)^(b)/
a\nb\n
0: b
1: b
/((?m)^b)/
a\nb\n
0: b
1: b
/\n((?m)^b)/
a\nb\n
0: \x0ab
1: b
/((?s).)c(?!.)/
a\nb\nc\n
0: \x0ac
1: \x0a
a\nb\nc\n
0: \x0ac
1: \x0a
/((?s)b.)c(?!.)/
a\nb\nc\n
0: b\x0ac
1: b\x0a
a\nb\nc\n
0: b\x0ac
1: b\x0a
/^b/
/()^b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a\nb\nc\n
No match
a\nb\nc\n
No match
/((?m)^b)/
a\nb\nc\n
0: b
1: b
/(x)?(?(1)a|b)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
a
No match
/(x)?(?(1)b|a)/
a
0: a
/()?(?(1)b|a)/
a
0: a
/()(?(1)b|a)/
/()?(?(1)a|b)/
a
0: a
1:
/^(\()?blah(?(1)(\)))$/
(blah)
0: (blah)
1: (
2: )
blah
0: blah
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
blah)
No match
(blah
No match
/^(\(+)?blah(?(1)(\)))$/
(blah)
0: (blah)
1: (
2: )
blah
0: blah
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
blah)
No match
(blah
No match
/(?(?!a)a|b)/
/(?(?!a)b|a)/
a
0: a
/(?(?=a)b|a)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
a
No match
/(?(?=a)a|b)/
a
0: a
/(?=(a+?))(\1ab)/
aaab
0: aab
1: a
2: aab
/^(?=(a+?))\1ab/
/(\w+:)+/
one:
0: one:
1: one:
/$(?<=^(a))/
a
0:
1: a
/(?=(a+?))(\1ab)/
aaab
0: aab
1: a
2: aab
/^(?=(a+?))\1ab/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaab
No match
aaab
No match
/([\w:]+::)?(\w+)$/
abcd
0: abcd
1: <unset>
2: abcd
xy:z:::abcd
0: xy:z:::abcd
1: xy:z:::
2: abcd
/^[^bcd]*(c+)/
aexycd
0: aexyc
1: c
/(a*)b+/
caab
0: aab
1: aa
/([\w:]+::)?(\w+)$/
abcd
0: abcd
1: <unset>
2: abcd
xy:z:::abcd
0: xy:z:::abcd
1: xy:z:::
2: abcd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcd:
No match
abcd:
No match
/^[^bcd]*(c+)/
aexycd
0: aexyc
1: c
/(>a+)ab/
/(?>a+)b/
aaab
0: aaab
/([[:]+)/
a:[b]:
0: :[
1: :[
/([[=]+)/
a=[b]=
0: =[
1: =[
/([[.]+)/
a.[b].
0: .[
1: .[
/((?>a+)b)/
aaab
0: aaab
1: aaab
/(?>(a+))b/
aaab
0: aaab
1: aaa
/((?>[^()]+)|\([^()]*\))+/
((abc(ade)ufh()()x
0: abc(ade)ufh()()x
1: x
/a\Z/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaab
No match
a\nb\n
No match
/b\Z/
a\nb\n
0: b
/b\z/
/b\Z/
a\nb
0: b
/b\z/
a\nb
0: b
/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
a
0: a
1:
abc
0: abc
1:
a-b
0: a-b
1:
0-9
0: 0-9
1:
a.b
0: a.b
1:
5.6.7
0: 5.6.7
1:
the.quick.brown.fox
0: the.quick.brown.fox
1:
a100.b200.300c
0: a100.b200.300c
1:
12-ab.1245
0: 12-ab.1245
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
\
No match
.a
No match
-a
No match
a-
No match
a.
No match
a_b
No match
a.-
No match
a..
No match
ab..bc
No match
the.quick.brown.fox-
No match
the.quick.brown.fox.
No match
the.quick.brown.fox_
No match
the.quick.brown.fox+
No match
/(?>.*)(?<=(abcd|wxyz))/
alphabetabcd
0: alphabetabcd
1: abcd
endingwxyz
0: endingwxyz
1: wxyz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a rather long string that doesn't end with one of them
No match
/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
word cat dog elephant mussel cow horse canary baboon snake shark otherword
0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
word cat dog elephant mussel cow horse canary baboon snake shark
No match
/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
No match
/(?<=\d{3}(?!999))foo/
999foo
0: foo
123999foo
0: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123abcfoo
No match
/(?<=(?!...999)\d{3})foo/
999foo
0: foo
123999foo
0: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123abcfoo
No match
/(?<=\d{3}(?!999)...)foo/
123abcfoo
0: foo
123456foo
0: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123999foo
No match
/(?<=\d{3}...)(?<!999)foo/
123abcfoo
0: foo
123456foo
0: foo
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123999foo
No match
/<a[\s]+href[\s]*=[\s]* # find <a href=
([\"\'])? # find single or double quote
(?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching
# quote, otherwise match up to next space
/isx
<a href=abcd xyz
0: <a href=abcd
1: <unset>
2: <unset>
3: abcd
<a href=\"abcd xyz pqr\" cats
0: <a href="abcd xyz pqr"
1: "
2: abcd xyz pqr
<a href=\'abcd xyz pqr\' cats
0: <a href='abcd xyz pqr'
1: '
2: abcd xyz pqr
/<a\s+href\s*=\s* # find <a href=
(["'])? # find single or double quote
(?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
# quote, otherwise match up to next space
/isx
<a href=abcd xyz
0: <a href=abcd
1: <unset>
2: <unset>
3: abcd
<a href=\"abcd xyz pqr\" cats
0: <a href="abcd xyz pqr"
1: "
2: abcd xyz pqr
<a href = \'abcd xyz pqr\' cats
0: <a href = 'abcd xyz pqr'
1: '
2: abcd xyz pqr
/<a\s+href(?>\s*)=(?>\s*) # find <a href=
(["'])? # find single or double quote
(?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
# quote, otherwise match up to next space
/isx
<a href=abcd xyz
0: <a href=abcd
1: <unset>
2: <unset>
3: abcd
<a href=\"abcd xyz pqr\" cats
0: <a href="abcd xyz pqr"
1: "
2: abcd xyz pqr
<a href = \'abcd xyz pqr\' cats
0: <a href = 'abcd xyz pqr'
1: '
2: abcd xyz pqr
/((Z)+|A)*/
ZABCDEFG
0: ZA
1: A
2: Z
/(Z()|A)*/
ZABCDEFG
0: ZA
1: A
2:
/(Z(())|A)*/
ZABCDEFG
0: ZA
1: A
2:
3:
/((?>Z)+|A)*/
ZABCDEFG
0: ZA
1: A
/((?>)+|A)*/
ZABCDEFG
0:
1:
/a*/g
abbab
0: a
0:
0:
0: a
0:
0:
/^[\d-a]/
abcde
0: a
-things
0: -
0digit
0: 0
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bcdef
No match
/[[:space:]]+/
> \x09\x0a\x0c\x0d\x0b<
0: \x09\x0a\x0c\x0d\x0b
/[[:blank:]]+/
> \x09\x0a\x0c\x0d\x0b<
0: \x09
/[\s]+/
> \x09\x0a\x0c\x0d\x0b<
0: \x09\x0a\x0c\x0d\x0b
/\s+/
> \x09\x0a\x0c\x0d\x0b<
0: \x09\x0a\x0c\x0d\x0b
/a b/x
ab
0: ab
/(?!\A)x/m
2015-09-16 18:49:48 +02:00
a\nxb\n
2014-07-24 18:32:38 +02:00
0: x
/(?!^)x/m
2015-09-16 18:49:48 +02:00
\= Expect no match
a\nxb\n
2014-07-24 18:32:38 +02:00
No match
/abc\Qabc\Eabc/
abcabcabc
0: abcabcabc
/abc\Q(*+|\Eabc/
abc(*+|abc
0: abc(*+|abc
/ abc\Q abc\Eabc/x
abc abcabc
0: abc abcabc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcabcabc
No match
/abc#comment
\Q#not comment
literal\E/x
abc#not comment\n literal
0: abc#not comment\x0a literal
/abc#comment
\Q#not comment
literal/x
abc#not comment\n literal
0: abc#not comment\x0a literal
/abc#comment
\Q#not comment
literal\E #more comment
/x
abc#not comment\n literal
0: abc#not comment\x0a literal
/abc#comment
\Q#not comment
literal\E #more comment/x
abc#not comment\n literal
0: abc#not comment\x0a literal
/\Qabc\$xyz\E/
abc\\\$xyz
0: abc\$xyz
/\Qabc\E\$\Qxyz\E/
abc\$xyz
0: abc$xyz
/\Gabc/
abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyzabc
No match
/\Gabc./g
abc1abc2xyzabc3
0: abc1
0: abc2
/abc./g
abc1abc2xyzabc3
0: abc1
0: abc2
0: abc3
/a(?x: b c )d/
XabcdY
0: abcd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Xa b c d Y
No match
/((?x)x y z | a b c)/
XabcY
0: abc
1: abc
AxyzB
0: xyz
1: xyz
/(?i)AB(?-i)C/
XabCY
0: abC
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
XabcY
No match
/((?i)AB(?-i)C|D)E/
abCE
0: abCE
1: abC
DE
0: DE
1: D
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcE
No match
abCe
No match
dE
No match
De
No match
/(.*)\d+\1/
abc123abc
0: abc123abc
1: abc
abc123bc
0: bc123bc
1: bc
/(.*)\d+\1/s
abc123abc
0: abc123abc
1: abc
abc123bc
0: bc123bc
1: bc
/((.*))\d+\1/
abc123abc
0: abc123abc
1: abc
2: abc
abc123bc
0: bc123bc
1: bc
2: bc
# This tests for an IPv6 address in the form where it can have up to
# eight components, one and only one of which is empty. This must be
# an internal component.
/^(?!:) # colon disallowed at start
(?: # start of item
(?: [0-9a-f]{1,4} | # 1-4 hex digits or
(?(1)0 | () ) ) # if null previously matched, fail; else null
: # followed by colon
){1,7} # end item; 1-7 of them required
[0-9a-f]{1,4} $ # final hex number at end of string
(?(1)|.) # check that there was an empty component
/ix
a123::a123
0: a123::a123
1:
a123:b342::abcd
0: a123:b342::abcd
1:
a123:b342::324e:abcd
0: a123:b342::324e:abcd
1:
a123:ddde:b342::324e:abcd
0: a123:ddde:b342::324e:abcd
1:
a123:ddde:b342::324e:dcba:abcd
0: a123:ddde:b342::324e:dcba:abcd
1:
a123:ddde:9999:b342::324e:dcba:abcd
0: a123:ddde:9999:b342::324e:dcba:abcd
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
1:2:3:4:5:6:7:8
No match
a123:bce:ddde:9999:b342::324e:dcba:abcd
No match
a123::9999:b342::324e:dcba:abcd
No match
abcde:2:3:4:5:6:7:8
No match
::1
No match
abcd:fee0:123::
No match
:1
No match
1:
No match
/[z\Qa-d]\E]/
z
0: z
a
0: a
-
0: -
d
0: d
]
0: ]
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
b
No match
/(a+)*b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
/(?i)reg(?:ul(?:[a<> ]|ae)r|ex)/
REGular
0: REGular
regulaer
0: regulaer
Regex
0: Regex
regul<75> r
0: regul\xe4r
/<2F> <> <EFBFBD> <EFBFBD> [<5B> -<2D> <> -<2D> ]+/
<20> <> <EFBFBD> <EFBFBD> <EFBFBD>
0: \xc5\xe6\xe5\xe4\xe0
<20> <> <EFBFBD> <EFBFBD> <EFBFBD>
0: \xc5\xe6\xe5\xe4\xff
<20> <> <EFBFBD> <EFBFBD> <EFBFBD>
0: \xc5\xe6\xe5\xe4\xc0
<20> <> <EFBFBD> <EFBFBD> <EFBFBD>
0: \xc5\xe6\xe5\xe4\xdf
/(?<=Z)X./
\x84XAZXB
0: XB
/ab cd (?x) de fg/
ab cd defg
0: ab cd defg
/ab cd(?x) de fg/
ab cddefg
0: ab cddefg
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcddefg
No match
/(?<![^f]oo)(bar)/
foobarX
0: bar
1: bar
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
boobarX
No match
/(?<![^f])X/
offX
0: X
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
onyX
No match
/(?<=[^f])X/
onyX
0: X
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
offX
No match
/^/gm
a\nb\nc\n
0:
0:
0:
\
0:
/(?<=C\n)^/gm
A\nC\nC\n
0:
/(?:(?(1)a|b)(X))+/
bXaX
0: bXaX
1: X
/(?:(?(1)\1a|b)(X|Y))+/
bXXaYYaY
0: bXXaYYaY
1: Y
bXYaXXaX
0: bX
1: X
/()()()()()()()()()(?:(?(10)\10a|b)(X|Y))+/
bXXaYYaY
0: bX
1:
2:
3:
4:
5:
6:
7:
8:
9:
10: X
/[[,abc,]+]/
abc]
0: abc]
a,b]
0: a,b]
[a,b,c]
0: [a,b,c]
/(?-x: )/x
A\x20B
0:
"(?x)(?-x: \s*#\s*)"
A # B
0: #
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
#
No match
"(?x-is)(?:(?-ixs) \s*#\s*) include"
A #include
0: #include
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
A#include
No match
A #Include
No match
/a*b*\w/
aaabbbb
0: aaabbbb
aaaa
0: aaaa
a
0: a
/a*b?\w/
aaabbbb
0: aaabb
aaaa
0: aaaa
a
0: a
/a*b{0,4}\w/
aaabbbb
0: aaabbbb
aaaa
0: aaaa
a
0: a
/a*b{0,}\w/
aaabbbb
0: aaabbbb
aaaa
0: aaaa
a
0: a
/a*\d*\w/
0a
0: 0a
a
0: a
/a*b *\w/x
a
0: a
/a*b#comment
*\w/x
a
0: a
/a* b *\w/x
a
0: a
/^\w+=.*(\\\n.*)*/
abc=xyz\\\npqr
0: abc=xyz\
/(?=(\w+))\1:/
abcd:
0: abcd:
1: abcd
/^(?=(\w+))\1:/
abcd:
0: abcd:
1: abcd
/^\Eabc/
abc
0: abc
/^[\Eabc]/
a
0: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
E
No match
/^[a-\Ec]/
b
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
-
No match
E
No match
/^[a\E\E-\Ec]/
b
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
-
No match
E
No match
/^[\E\Qa\E-\Qz\E]+/
b
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
-
No match
/^[a\Q]bc\E]/
a
0: a
]
0: ]
c
0: c
/^[a-\Q\E]/
a
0: a
-
0: -
/^(a()*)*/
aaaa
0: aaaa
1: a
2:
/^(?:a(?:(?:))*)*/
aaaa
0: aaaa
/^(a()+)+/
aaaa
0: aaaa
1: a
2:
/^(?:a(?:(?:))+)+/
aaaa
0: aaaa
/(a){0,3}(?(1)b|(c|))*D/
abbD
0: abbD
1: a
ccccD
0: ccccD
1: <unset>
2:
D
0: D
1: <unset>
2:
/(a|)*\d/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
1:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
2015-09-16 18:49:48 +02:00
/(?>a|)*\d/
2014-07-24 18:32:38 +02:00
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
2015-09-16 18:49:48 +02:00
/(?:a|)*\d/
2014-07-24 18:32:38 +02:00
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
2015-09-16 18:49:48 +02:00
\= Expect no match
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
2014-07-24 18:32:38 +02:00
/\Z/g
abc\n
0:
0:
/^(?s)(?>.*)(?<!\n)/
abc
0: abc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\n
No match
/^(?![^\n]*\n\z)/
abc
0:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\n
No match
/\z(?<!\n)/
abc
0:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc\n
No match
/(.*(.)?)*/
abcd
0: abcd
1:
/( (A | (?(1)0|) )* )/x
abcd
0:
1:
2:
/( ( (?(1)0|) )* )/x
abcd
0:
1:
2:
/( (?(1)0|)* )/x
abcd
0:
1:
/[[:abcd:xyz]]/
a]
0: a]
:]
0: :]
/[abc[:x\]pqr]/
a
0: a
[
0: [
:
0: :
]
0: ]
p
0: p
/.*[op][xyz]/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
fooabcfoo
No match
/(?(?=.*b)b|^)/
adc
0:
abc
0: b
/(?(?=^.*b)b|^)/
adc
0:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
/(?(?=.*b)b|^)*/
adc
0:
abc
0:
/(?(?=.*b)b|^)+/
adc
0:
abc
0: b
/(?(?=b).*b|^d)/
abc
0: b
/(?(?=.*b).*b|^d)/
abc
0: ab
/^%((?(?=[a])[^%])|b)*%$/
%ab%
0: %ab%
1:
/(?i)a(?-i)b|c/
XabX
0: ab
XAbX
0: Ab
CcC
0: c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
XABX
No match
/[\x00-\xff\s]+/
\x0a\x0b\x0c\x0d
0: \x0a\x0b\x0c\x0d
/(abc)\1/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
/(abc)\1/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match
/[^a]*/i
12abc
0: 12
12ABC
0: 12
/[^a]*+/i
12abc
0: 12
12ABC
0: 12
/[^a]*?X/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
12abc
No match
12ABC
No match
/[^a]+?X/i
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
12abc
No match
12ABC
No match
/[^a]?X/i
12aXbcX
0: X
12AXBCX
0: X
BCX
0: CX
/[^a]??X/i
12aXbcX
0: X
12AXBCX
0: X
BCX
0: CX
/[^a]?+X/i
12aXbcX
0: cX
12AXBCX
0: CX
BCX
0: CX
/[^a]{2,3}/i
abcdef
0: bcd
ABCDEF
0: BCD
/[^a]{2,3}?/i
abcdef
0: bc
ABCDEF
0: BC
/[^a]{2,3}+/i
abcdef
0: bcd
ABCDEF
0: BCD
/((a|)+)+Z/
Z
0: Z
1:
2:
/(a)b|(a)c/
ac
0: ac
1: <unset>
2: a
/(?>(a))b|(a)c/
ac
0: ac
1: <unset>
2: a
/(?=(a))ab|(a)c/
ac
0: ac
1: <unset>
2: a
/((?>(a))b|(a)c)/
ac
0: ac
1: ac
2: <unset>
3: a
/((?>(a))b|(a)c)++/
ac
0: ac
1: ac
2: <unset>
3: a
/(?:(?>(a))b|(a)c)++/
ac
0: ac
1: <unset>
2: a
/(?=(?>(a))b|(a)c)(..)/
ac
0: ac
1: <unset>
2: a
3: ac
/(?>(?>(a))b|(a)c)/
ac
0: ac
1: <unset>
2: a
/(?:(?>([ab])))+a=/aftertext
=ba=
0: ba=
0+
1: b
/(?>([ab]))+a=/aftertext
=ba=
0: ba=
0+
1: b
/((?>(a+)b)+(aabab))/
aaaabaaabaabab
0: aaaabaaabaabab
1: aaaabaaabaabab
2: aaa
3: aabab
/(?>a+|ab)+?c/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/(?>a+|ab)+c/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/(?:a+|ab)+c/
aabc
0: aabc
/(?(?=(a))a)/
a
0: a
1: a
/(?(?=(a))a)(b)/
ab
0: ab
1: a
2: b
/^(?:a|ab)++c/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaabc
No match
/^(?>a|ab)++c/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaabc
No match
/^(?:a|ab)+c/
aaaabc
0: aaaabc
/(?=abc){3}abc/aftertext
abcabcabc
0: abc
0+ abcabc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyz
No match
/(?=abc)+abc/aftertext
abcabcabc
0: abc
0+ abcabc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyz
No match
/(?=abc)++abc/aftertext
abcabcabc
0: abc
0+ abcabc
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyz
No match
/(?=abc){0}xyz/
xyz
0: xyz
/(?=abc){1}xyz/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyz
No match
/(?=(a))?./
ab
0: a
1: a
bc
0: b
/(?=(a))??./
ab
0: a
bc
0: b
/^(?=(?1))?[az]([abc])d/
abd
0: abd
1: b
zcdxx
0: zcd
1: c
/^(?!a){0}\w+/
aaaaa
0: aaaaa
/(?<=(abc))?xyz/
abcxyz
0: xyz
1: abc
pqrxyz
0: xyz
/^[\g<a>]+/
ggg<<<aaa>>>
0: ggg<<<aaa>>>
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
\\ga
No match
/^[\ga]+/
gggagagaxyz
0: gggagaga
/^[:a[:digit:]]+/
aaaa444:::Z
0: aaaa444:::
/^[:a[:digit:]:b]+/
aaaa444:::bbbZ
0: aaaa444:::bbb
/[:a]xxx[b:]/
:xxx:
0: :xxx:
/(?<=a{2})b/i
xaabc
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xabc
No match
/(?<!a{2})b/i
xabc
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xaabc
No match
/(?<=a\h)c/
xa c
0: c
/(?<=[^a]{2})b/
axxbc
0: b
aAAbc
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xaabc
No match
/(?<=[^a]{2})b/i
axxbc
0: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aAAbc
No match
xaabc
No match
/(?<=a\H)c/
abc
0: c
/(?<=a\V)c/
abc
0: c
/(?<=a\v)c/
a\nc
0: c
/(?(?=c)c|d)++Y/
XcccddYX
0: cccddY
/(?(?=c)c|d)*+Y/
XcccddYX
0: cccddY
/^(a{2,3}){2,}+a/
aaaaaaa
0: aaaaaaa
1: aaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaa
No match
aaaaaaaaa
No match
/^(a{2,3})++a/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaa
No match
/^(a{2,3})*+a/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaa
No match
/\H\h\V\v/
X X\x0a
0: X X\x0a
X\x09X\x0b
0: X\x09X\x0b
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
\xa0 X\x0a
No match
/\H*\h+\V?\v{3,4}/
\x09\x20\xa0X\x0a\x0b\x0c\x0d\x0a
0: \x09 \xa0X\x0a\x0b\x0c\x0d
\x09\x20\xa0\x0a\x0b\x0c\x0d\x0a
0: \x09 \xa0\x0a\x0b\x0c\x0d
\x09\x20\xa0\x0a\x0b\x0c
0: \x09 \xa0\x0a\x0b\x0c
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
\x09\x20\xa0\x0a\x0b
No match
/\H{3,4}/
XY ABCDE
0: ABCD
XY PQR ST
0: PQR
/.\h{3,4}./
XY AB PQRS
0: B P
/\h*X\h?\H+Y\H?Z/
>XNNNYZ
0: XNNNYZ
> X NYQZ
0: X NYQZ
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
>XYZ
No match
> X NY Z
No match
/\v*X\v?Y\v+Z\V*\x0a\V+\x0b\V{2,3}\x0c/
>XY\x0aZ\x0aA\x0bNN\x0c
0: XY\x0aZ\x0aA\x0bNN\x0c
>\x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
0: \x0a\x0dX\x0aY\x0a\x0bZZZ\x0aAAA\x0bNNN\x0c
/(foo)\Kbar/
foobar
0: bar
1: foo
/(foo)(\Kbar|baz)/
foobar
0: bar
1: foo
2: bar
foobaz
0: foobaz
1: foo
2: baz
/(foo\Kbar)baz/
foobarbaz
0: barbaz
1: foobar
/abc\K|def\K/g,aftertext
Xabcdefghi
0:
0+ defghi
0:
0+ ghi
/ab\Kc|de\Kf/g,aftertext
Xabcdefghi
0: c
0+ defghi
0: f
0+ ghi
/(?=C)/g,aftertext
ABCDECBA
0:
0+ CDECBA
0:
0+ CBA
/^abc\K/aftertext
abcdef
0:
0+ def
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
defabcxyz
No match
2015-08-03 19:25:55 +02:00
/^(a(b))\1\g1\g{1}\g-1\g{-1}\g{-2}Z/
2014-07-24 18:32:38 +02:00
ababababbbabZXXXX
0: ababababbbabZ
1: ab
2: b
/(?<A>tom|bon)-\g{A}/
tom-tom
0: tom-tom
1: tom
bon-bon
0: bon-bon
1: bon
/(^(a|b\g{-1}))/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bacxxx
No match
/(?|(abc)|(xyz))\1/
abcabc
0: abcabc
1: abc
xyzxyz
0: xyzxyz
1: xyz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcxyz
No match
xyzabc
No match
/(?|(abc)|(xyz))(?1)/
abcabc
0: abcabc
1: abc
xyzabc
0: xyzabc
1: xyz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xyzxyz
No match
/^X(?5)(a)(?|(b)|(q))(c)(d)(Y)/
XYabcdY
0: XYabcdY
1: a
2: b
3: c
4: d
5: Y
/^X(?7)(a)(?|(b|(r)(s))|(q))(c)(d)(Y)/
XYabcdY
0: XYabcdY
1: a
2: b
3: <unset>
4: <unset>
5: c
6: d
7: Y
/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/
XYabcdY
0: XYabcdY
1: a
2: b
3: <unset>
4: <unset>
5: c
6: d
7: Y
/(?'abc'\w+):\k<abc>{2}/
a:aaxyz
0: a:aa
1: a
ab:ababxyz
0: ab:abab
1: ab
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a:axyz
No match
ab:abxyz
No match
/(?'abc'\w+):\g{abc}{2}/
a:aaxyz
0: a:aa
1: a
ab:ababxyz
0: ab:abab
1: ab
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a:axyz
No match
ab:abxyz
No match
/^(?<ab>a)? (?(<ab>)b|c) (?('ab')d|e)/x
abd
0: abd
1: a
ce
0: ce
/^(a.)\g-1Z/
aXaXZ
0: aXaXZ
1: aX
/^(a.)\g{-1}Z/
aXaXZ
0: aXaXZ
1: aX
/^(?(DEFINE) (?<A> a) (?<B> b) ) (?&A) (?&B) /x
abcd
0: ab
/(?<NAME>(?&NAME_PAT))\s+(?<ADDR>(?&ADDRESS_PAT))
(?(DEFINE)
(?<NAME_PAT>[a-z]+)
(?<ADDRESS_PAT>\d+)
)/x
metcalfe 33
0: metcalfe 33
1: metcalfe
2: 33
/(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
1.2.3.4
0: 1.2.3.4
1: <unset>
2: .4
131.111.10.206
0: 131.111.10.206
1: <unset>
2: .206
10.0.0.0
0: 10.0.0.0
1: <unset>
2: .0
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
10.6
No match
455.3.4.5
No match
/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
1.2.3.4
0: 1.2.3.4
1: .4
131.111.10.206
0: 131.111.10.206
1: .206
10.0.0.0
0: 10.0.0.0
1: .0
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
10.6
No match
455.3.4.5
No match
/^(\w++|\s++)*$/
now is the time for all good men to come to the aid of the party
0: now is the time for all good men to come to the aid of the party
1: party
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
this is not a line with only words and spaces!
No match
/(\d++)(\w)/
12345a
0: 12345a
1: 12345
2: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
12345+
No match
/a++b/
aaab
0: aaab
/(a++b)/
aaab
0: aaab
1: aaab
/(a++)b/
aaab
0: aaab
1: aaa
/([^()]++|\([^()]*\))+/
((abc(ade)ufh()()x
0: abc(ade)ufh()()x
1: x
/\(([^()]++|\([^()]+\))+\)/
(abc)
0: (abc)
1: abc
(abc(def)xyz)
0: (abc(def)xyz)
1: xyz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
/^([^()]|\((?1)*\))*$/
abc
0: abc
1: c
a(b)c
0: a(b)c
1: c
a(b(c))d
0: a(b(c))d
1: d
2015-09-16 18:49:48 +02:00
\= Expect no match)
2014-07-24 18:32:38 +02:00
a(b(c)d
No match
/^>abc>([^()]|\((?1)*\))*<xyz<$/
>abc>123<xyz<
0: >abc>123<xyz<
1: 3
>abc>1(2)3<xyz<
0: >abc>1(2)3<xyz<
1: 3
>abc>(1(2)3)<xyz<
0: >abc>(1(2)3)<xyz<
1: (1(2)3)
/^(?:((.)(?1)\2|)|((.)(?3)\4|.))$/i
1221
0: 1221
1: 1221
2: 1
Satanoscillatemymetallicsonatas
0: Satanoscillatemymetallicsonatas
1: <unset>
2: <unset>
3: Satanoscillatemymetallicsonatas
4: S
AmanaplanacanalPanama
0: AmanaplanacanalPanama
1: <unset>
2: <unset>
3: AmanaplanacanalPanama
4: A
AblewasIereIsawElba
0: AblewasIereIsawElba
1: <unset>
2: <unset>
3: AblewasIereIsawElba
4: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Thequickbrownfox
No match
/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
12
0: 12
1: 12
(((2+2)*-3)-7)
0: (((2+2)*-3)-7)
1: (((2+2)*-3)-7)
2: -
-12
0: -12
1: -12
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
((2+2)*-3)-7)
No match
/^(x(y|(?1){2})z)/
xyz
0: xyz
1: xyz
2: y
xxyzxyzz
0: xxyzxyzz
1: xxyzxyzz
2: xyzxyz
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xxyzz
No match
xxyzxyzxyzz
No match
/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x
<>
0: <>
1: <>
2: <>
<abcd>
0: <abcd>
1: <abcd>
2: <abcd>
<abc <123> hij>
0: <abc <123> hij>
1: <abc <123> hij>
2: <abc <123> hij>
<abc <def> hij>
0: <def>
1: <def>
2: <def>
<abc<>def>
0: <abc<>def>
1: <abc<>def>
2: <abc<>def>
<abc<>
0: <>
1: <>
2: <>
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
<abc
No match
/^a+(*FAIL)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaa
No match
/a+b?c+(*FAIL)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaabccc
No match
/a+b?(*PRUNE)c+(*FAIL)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaabccc
No match
/a+b?(*COMMIT)c+(*FAIL)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaabccc
No match
/a+b?(*SKIP)c+(*FAIL)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaabcccaaabccc
No match
/^(?:aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
aaaxxxxxx
0: aaaxxxxxx
aaa++++++
0: aaa
bbbxxxxx
0: bbbxxxxx
bbb+++++
0: bbb
cccxxxx
0: cccxxxx
ccc++++
0: ccc
dddddddd
0: ddd
/^(aaa(*THEN)\w{6}|bbb(*THEN)\w{5}|ccc(*THEN)\w{4}|\w{3})/
aaaxxxxxx
0: aaaxxxxxx
1: aaaxxxxxx
aaa++++++
0: aaa
1: aaa
bbbxxxxx
0: bbbxxxxx
1: bbbxxxxx
bbb+++++
0: bbb
1: bbb
cccxxxx
0: cccxxxx
1: cccxxxx
ccc++++
0: ccc
1: ccc
dddddddd
0: ddd
1: ddd
/a+b?(*THEN)c+(*FAIL)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaabccc
No match
/(A (A|B(*ACCEPT)|C) D)(E)/x
AB
0: AB
1: AB
2: B
ABX
0: AB
1: AB
2: B
AADE
0: AADE
1: AAD
2: A
3: E
ACDE
0: ACDE
1: ACD
2: C
3: E
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AD
No match
/^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
1221
0: 1221
1: 1221
2: 1
Satan, oscillate my metallic sonatas!
0: Satan, oscillate my metallic sonatas!
1: <unset>
2: <unset>
3: Satan, oscillate my metallic sonatas
4: S
A man, a plan, a canal: Panama!
0: A man, a plan, a canal: Panama!
1: <unset>
2: <unset>
3: A man, a plan, a canal: Panama
4: A
Able was I ere I saw Elba.
0: Able was I ere I saw Elba.
1: <unset>
2: <unset>
3: Able was I ere I saw Elba
4: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
The quick brown fox
No match
/^((.)(?1)\2|.)$/
a
0: a
1: a
aba
0: aba
1: aba
2: a
aabaa
0: aabaa
1: aabaa
2: a
abcdcba
0: abcdcba
1: abcdcba
2: a
pqaabaaqp
0: pqaabaaqp
1: pqaabaaqp
2: p
ablewasiereisawelba
0: ablewasiereisawelba
1: ablewasiereisawelba
2: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
rhubarb
No match
the quick brown fox
No match
/(a)(?<=b(?1))/
baz
0: a
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
caz
No match
/(?<=b(?1))(a)/
zbaaz
0: a
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/(?<X>a)(?<=b(?&X))/
baz
0: a
1: a
/^(?|(abc)|(def))\1/
abcabc
0: abcabc
1: abc
defdef
0: defdef
1: def
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcdef
No match
defabc
No match
/^(?|(abc)|(def))(?1)/
abcabc
0: abcabc
1: abc
defabc
0: defabc
1: def
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
defdef
No match
abcdef
No match
/(?:a(?<quote> (?<apostrophe>')|(?<realquote>")) |b(?<quote> (?<apostrophe>')|(?<realquote>")) ) (?('quote')[a-z]+|[0-9]+)/x,dupnames
a\"aaaaa
0: a"aaaaa
1: "
2: <unset>
3: "
b\"aaaaa
0: b"aaaaa
1: <unset>
2: <unset>
3: <unset>
4: "
5: <unset>
6: "
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
b\"11111
No match
/(?:(?1)|B)(A(*F)|C)/
ABCD
0: BC
1: C
CCD
0: CC
1: C
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
CAD
No match
/^(?:(?1)|B)(A(*F)|C)/
CCD
0: CC
1: C
BCD
0: BC
1: C
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ABCD
No match
CAD
No match
BAD
No match
/(?:(?1)|B)(A(*ACCEPT)XX|C)D/
AAD
0: AA
1: A
ACD
0: ACD
1: C
BAD
0: BA
1: A
BCD
0: BCD
1: C
BAX
0: BA
1: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ACX
No match
ABC
No match
/(?(DEFINE)(A))B(?1)C/
BAC
0: BAC
/(?(DEFINE)((A)\2))B(?1)C/
BAAC
0: BAAC
/(?<pn> \( ( [^()]++ | (?&pn) )* \) )/x
(ab(cd)ef)
0: (ab(cd)ef)
1: (ab(cd)ef)
2: ef
/^(?=a(*SKIP)b|ac)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ac
No match
/^(?=a(*PRUNE)b)/
ab
0:
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ac
No match
/^(?=a(*ACCEPT)b)/
ac
0:
/(?>a\Kb)/
ab
0: b
/((?>a\Kb))/
ab
0: b
1: ab
/(a\Kb)/
ab
0: b
1: ab
/^a\Kcz|ac/
ac
0: ac
/(?>a\Kbz|ab)/
ab
0: ab
/^(?&t)(?(DEFINE)(?<t>a\Kb))$/
ab
0: b
/^([^()]|\((?1)*\))*$/
a(b)c
0: a(b)c
1: c
a(b(c)d)e
0: a(b(c)d)e
1: e
/(?P<L1>(?P<L2>0)(?P>L1)|(?P>L2))/
0
0: 0
1: 0
00
0: 00
1: 00
2: 0
0000
0: 0000
1: 0000
2: 0
/(?P<L1>(?P<L2>0)|(?P>L2)(?P>L1))/
0
0: 0
1: 0
2: 0
00
0: 0
1: 0
2: 0
0000
0: 0
1: 0
2: 0
# This one does fail, as expected, in Perl. It needs the complex item at the
# end of the pattern. A single letter instead of (B|D) makes it not fail, which
# I think is a Perl bug.
/A(*COMMIT)(B|D)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ACABX
No match
# Check the use of names for failure
/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AC
No match, mark = A
CB
No match, mark = B
/(*MARK:A)(*SKIP:B)(C|X)/mark
C
0: C
1: C
MK: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
D
No match, mark = A
/^(A(*THEN:A)B|C(*THEN:B)D)/mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
CB
No match, mark = B
/^(?:A(*THEN:A)B|C(*THEN:B)D)/mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
CB
No match, mark = B
/^(?>A(*THEN:A)B|C(*THEN:B)D)/mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
CB
No match, mark = B
# This should succeed, as the skip causes bump to offset 1 (the mark). Note
# that we have to have something complicated such as (B|Z) at the end because,
# for Perl, a simple character somehow causes an unwanted optimization to mess
# with the handling of backtracking verbs.
/A(*MARK:A)A+(*SKIP:A)(B|Z) | AC/x,mark
AAAC
0: AC
# Test skipping over a non-matching mark.
/A(*MARK:A)A+(*MARK:B)(*SKIP:A)(B|Z) | AC/x,mark
AAAC
0: AC
# Check shorthand for MARK.
/A(*:A)A+(*SKIP:A)(B|Z) | AC/x,mark
AAAC
0: AC
/(*:A)A+(*SKIP:A)(B|Z)/mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AAAC
No match, mark = A
# This should succeed, as a non-existent skip name disables the skip.
/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
AAAC
0: AC
/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC(*:B)/x,mark
AAAC
0: AC
MK: B
# COMMIT at the start of a pattern should act like an anchor. Again, however,
# we need the complication for Perl.
/(*COMMIT)(A|P)(B|P)(C|P)/
ABCDEFG
0: ABC
1: A
2: B
3: C
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
DEFGABC
No match
# COMMIT inside an atomic group can't stop backtracking over the group.
/(\w+)(?>b(*COMMIT))\w{2}/
abbb
0: abbb
1: a
/(\w+)b(*COMMIT)\w{2}/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abbb
No match
# Check opening parens in comment when seeking forward reference.
/(?&t)(?#()(?(DEFINE)(?<t>a))/
bac
0: a
# COMMIT should override THEN.
/(?>(*COMMIT)(?>yes|no)(*THEN)(*F))?/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
yes
No match
/(?>(*COMMIT)(yes|no)(*THEN)(*F))?/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
yes
No match
/b?(*SKIP)c/
bc
0: bc
abc
0: bc
/(*SKIP)bc/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
/(*SKIP)b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
/(?P<abn>(?P=abn)xxx|)+/
xxx
0:
1:
/(?i:([^b]))(?1)/
aa
0: aa
1: a
aA
0: aA
1: a
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
aB
No match
Ba
No match
ba
No match
/^(?&t)*+(?(DEFINE)(?<t>a))\w$/
aaaaaaX
0: aaaaaaX
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaa
No match
/^(?&t)*(?(DEFINE)(?<t>a))\w$/
aaaaaaX
0: aaaaaaX
aaaaaa
0: aaaaaa
/^(a)*+(\w)/
aaaaX
0: aaaaX
1: a
2: X
YZ
0: Y
1: <unset>
2: Y
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaa
No match
/^(?:a)*+(\w)/
aaaaX
0: aaaaX
1: X
YZ
0: Y
1: Y
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaa
No match
/^(a)++(\w)/
aaaaX
0: aaaaX
1: a
2: X
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaa
No match
YZ
No match
/^(?:a)++(\w)/
aaaaX
0: aaaaX
1: X
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaa
No match
YZ
No match
/^(a)?+(\w)/
aaaaX
0: aa
1: a
2: a
YZ
0: Y
1: <unset>
2: Y
/^(?:a)?+(\w)/
aaaaX
0: aa
1: a
YZ
0: Y
1: Y
/^(a){2,}+(\w)/
aaaaX
0: aaaaX
1: a
2: X
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
YZ
No match
/^(?:a){2,}+(\w)/
aaaaX
0: aaaaX
1: X
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
YZ
No match
/(a|)*(?1)b/
b
0: b
1:
ab
0: ab
1:
aab
0: aab
1:
/(a)++(?1)b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
aab
No match
/(a)*+(?1)b/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ab
No match
aab
No match
/(?1)(?:(b)){0}/
b
0: b
/(foo ( \( ((?:(?> [^()]+ )|(?2))*) \) ) )/x
foo(bar(baz)+baz(bop))
0: foo(bar(baz)+baz(bop))
1: foo(bar(baz)+baz(bop))
2: (bar(baz)+baz(bop))
3: bar(baz)+baz(bop)
/(A (A|B(*ACCEPT)|C) D)(E)/x
AB
0: AB
1: AB
2: B
/\A.*?(a|bc)/
ba
0: ba
1: a
/\A.*?(?:a|bc)++/
ba
0: ba
/\A.*?(a|bc)++/
ba
0: ba
1: a
/\A.*?(?:a|bc|d)/
ba
0: ba
/(?:(b))++/
beetle
0: b
1: b
/(?(?=(a(*ACCEPT)z))a)/
a
0: a
1: a
/^(a)(?1)+ab/
aaaab
0: aaaab
1: a
/^(a)(?1)++ab/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaab
No match
/^(?=a(*:M))aZ/mark
aZbc
0: aZ
MK: M
/^(?!(*:M)b)aZ/mark
aZbc
0: aZ
/(?(DEFINE)(a))?b(?1)/
backgammon
0: ba
/^\N+/
abc\ndef
0: abc
/^\N{1,}/
abc\ndef
0: abc
/(?(R)a+|(?R)b)/
aaaabcde
0: aaaab
/(?(R)a+|((?R))b)/
aaaabcde
0: aaaab
1: aaaa
/((?(R)a+|(?1)b))/
aaaabcde
0: aaaab
1: aaaab
/((?(R1)a+|(?1)b))/
aaaabcde
0: aaaab
1: aaaab
2014-08-08 17:36:18 +02:00
/((?(R)a|(?1)))*/
aaa
0: aaa
1: a
/((?(R)a|(?1)))+/
aaa
0: aaa
1: a
2014-07-24 18:32:38 +02:00
/a(*:any
name)/mark
abc
0: a
MK: any \x0aname
/(?>(?&t)c|(?&t))(?(DEFINE)(?<t>a|b(*PRUNE)c))/
a
0: a
ba
0: a
bba
0: a
# Checking revised (*THEN) handling.
# Capture
/^.*? (a(*THEN)b) c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/^.*? (a(*THEN)b|(*F)) c/x
aabc
0: aabc
1: ab
/^.*? ( (a(*THEN)b) | (*F) ) c/x
aabc
0: aabc
1: ab
2: ab
/^.*? ( (a(*THEN)b) ) c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
# Non-capture
/^.*? (?:a(*THEN)b) c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/^.*? (?:a(*THEN)b|(*F)) c/x
aabc
0: aabc
/^.*? (?: (?:a(*THEN)b) | (*F) ) c/x
aabc
0: aabc
/^.*? (?: (?:a(*THEN)b) ) c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
# Atomic
/^.*? (?>a(*THEN)b) c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/^.*? (?>a(*THEN)b|(*F)) c/x
aabc
0: aabc
/^.*? (?> (?>a(*THEN)b) | (*F) ) c/x
aabc
0: aabc
/^.*? (?> (?>a(*THEN)b) ) c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
# Possessive capture
/^.*? (a(*THEN)b)++ c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/^.*? (a(*THEN)b|(*F))++ c/x
aabc
0: aabc
1: ab
/^.*? ( (a(*THEN)b)++ | (*F) )++ c/x
aabc
0: aabc
1: ab
2: ab
/^.*? ( (a(*THEN)b)++ )++ c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
# Possessive non-capture
/^.*? (?:a(*THEN)b)++ c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
/^.*? (?:a(*THEN)b|(*F))++ c/x
aabc
0: aabc
/^.*? (?: (?:a(*THEN)b)++ | (*F) )++ c/x
aabc
0: aabc
/^.*? (?: (?:a(*THEN)b)++ )++ c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aabc
No match
# Condition assertion
/^(?(?=a(*THEN)b)ab|ac)/
ac
0: ac
# Condition
/^.*?(?(?=a)a|b(*THEN)c)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ba
No match
/^.*?(?:(?(?=a)a|b(*THEN)c)|d)/
ba
0: ba
/^.*?(?(?=a)a(*THEN)b|c)/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ac
No match
# Assertion
/^.*(?=a(*THEN)b)/
aabc
0: a
# --------------------------
/(?>a(*:m))/imsx,mark
a
0: a
MK: m
/(?>(a)(*:m))/imsx,mark
a
0: a
1: a
MK: m
/(?<=a(*ACCEPT)b)c/
xacd
0: c
/(?<=(a(*ACCEPT)b))c/
xacd
0: c
1: a
/(?<=(a(*COMMIT)b))c/
xabcd
0: c
1: ab
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
xacd
No match
/(?<!a(*FAIL)b)c/
xcd
0: c
acd
0: c
/(?<=a(*:N)b)c/mark
xabcd
0: c
MK: N
/(?<=a(*PRUNE)b)c/
xabcd
0: c
/(?<=a(*SKIP)b)c/
xabcd
0: c
/(?<=a(*THEN)b)c/
xabcd
0: c
/(a)(?2){2}(.)/
abcd
0: abcd
1: a
2: d
/(*MARK:A)(*PRUNE:B)(C|X)/mark
C
0: C
1: C
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
D
No match, mark = B
/(*MARK:A)(*PRUNE:B)(C|X)/mark
C
0: C
1: C
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
D
No match, mark = B
/(*MARK:A)(*THEN:B)(C|X)/mark
C
0: C
1: C
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
D
No match, mark = B
/(*MARK:A)(*THEN:B)(C|X)/mark,no_start_optimize
C
0: C
1: C
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
D
No match, mark = B
/(*MARK:A)(*THEN:B)(C|X)/mark
C
0: C
1: C
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
D
No match, mark = B
# This should fail, as the skip causes a bump to offset 3 (the skip).
/A(*MARK:A)A+(*SKIP)(B|Z) | AC/x,mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AAAC
No match, mark = A
# Same
/A(*MARK:A)A+(*MARK:B)(*SKIP:B)(B|Z) | AC/x,mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AAAC
No match, mark = B
/A(*:A)A+(*SKIP)(B|Z) | AC/x,mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AAAC
No match, mark = A
# This should fail, as a null name is the same as no name.
/A(*MARK:A)A+(*SKIP:)(B|Z) | AC/x,mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AAAC
No match, mark = A
# A check on what happens after hitting a mark and them bumping along to
# something that does not even start. Perl reports tags after the failures
# here, though it does not when the individual letters are made into something
# more complicated.
/A(*:A)B|XX(*:B)Y/mark
AABC
0: AB
MK: A
XXYZ
0: XXY
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
XAQQ
No match, mark = A
XAQQXZZ
No match, mark = A
AXQQQ
No match, mark = A
AXXQQQ
No match, mark = B
/^(A(*THEN:A)B|C(*THEN:B)D)/mark
AB
0: AB
1: AB
MK: A
CD
0: CD
1: CD
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AC
No match, mark = A
CB
No match, mark = B
/^(A(*PRUNE:A)B|C(*PRUNE:B)D)/mark
AB
0: AB
1: AB
MK: A
CD
0: CD
1: CD
MK: B
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AC
No match, mark = A
CB
No match, mark = B
# An empty name does not pass back an empty string. It is the same as if no
# name were given.
/^(A(*PRUNE:)B|C(*PRUNE:B)D)/mark
AB
0: AB
1: AB
CD
0: CD
1: CD
MK: B
# PRUNE goes to next bumpalong; COMMIT does not.
/A(*PRUNE:A)B/mark
ACAB
0: AB
MK: A
# Mark names can be duplicated.
/A(*:A)B|X(*:A)Y/mark
AABC
0: AB
MK: A
XXYZ
0: XY
MK: A
/b(*:m)f|a(*:n)w/mark
aw
0: aw
MK: n
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match, mark = m
/b(*:m)f|aw/mark
abaw
0: aw
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abc
No match, mark = m
abax
No match, mark = m
/A(*MARK:A)A+(*SKIP:B)(B|Z) | AAC/x,mark
AAAC
0: AAC
/a(*PRUNE:X)bc|qq/mark,no_start_optimize
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
axy
No match, mark = X
/a(*THEN:X)bc|qq/mark,no_start_optimize
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
axy
No match, mark = X
/(?=a(*MARK:A)b)..x/mark
abxy
0: abx
MK: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abpq
No match
/(?=a(*MARK:A)b)..(*:Y)x/mark
abxy
0: abx
MK: Y
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abpq
No match
/(?=a(*PRUNE:A)b)..x/mark
abxy
0: abx
MK: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abpq
No match
/(?=a(*PRUNE:A)b)..(*:Y)x/mark
abxy
0: abx
MK: Y
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abpq
No match
/(?=a(*THEN:A)b)..x/mark
abxy
0: abx
MK: A
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abpq
No match
/(?=a(*THEN:A)b)..(*:Y)x/mark
abxy
0: abx
MK: Y
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abpq
No match
/(another)?(\1?)test/
hello world test
0: test
1: <unset>
2:
/(another)?(\1+)test/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
hello world test
No match
/(a(*COMMIT)b){0}a(?1)|aac/
aac
0: aac
/((?:a?)*)*c/
aac
0: aac
1:
/((?>a?)*)*c/
aac
0: aac
1:
/(?>.*?a)(?<=ba)/
aba
0: ba
/(?:.*?a)(?<=ba)/
aba
0: aba
/(?>.*?a)b/s
aab
0: ab
/(?>.*?a)b/
aab
0: ab
/(?>^a)b/s
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aab
No match
/(?>.*?)(?<=(abcd)|(wxyz))/
alphabetabcd
0:
1: abcd
endingwxyz
0:
1: <unset>
2: wxyz
/(?>.*)(?<=(abcd)|(wxyz))/
alphabetabcd
0: alphabetabcd
1: abcd
endingwxyz
0: endingwxyz
1: <unset>
2: wxyz
"(?>.*)foo"
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcdfooxyz
No match
"(?>.*?)foo"
abcdfooxyz
0: foo
/(?:(a(*PRUNE)b)){0}(?:(?1)|ac)/
ac
0: ac
/(?:(a(*SKIP)b)){0}(?:(?1)|ac)/
ac
0: ac
/(?<=(*SKIP)ac)a/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aa
No match
/A(*MARK:A)A+(*SKIP:B)(B|Z) | AC/x,mark
AAAC
0: AC
/a(*SKIP:m)x|ac(*:n)(*SKIP:n)d|ac/mark
acacd
0: acd
MK: n
/A(*SKIP:m)x|A(*SKIP:n)x|AB/mark
AB
0: AB
/((*SKIP:r)d){0}a(*SKIP:m)x|ac(*:n)|ac/mark
acacd
0: ac
MK: n
# Tests that try to figure out how Perl works. My hypothesis is that the first
# verb that is backtracked onto is the one that acts. This seems to be the case
# almost all the time, but there is one exception that is perhaps a bug.
# This matches "aaaac"; each PRUNE advances one character until the subject no
# longer starts with 5 'a's.
/aaaaa(*PRUNE)b|a+c/
aaaaaac
0: aaaac
# Putting SKIP in front of PRUNE makes no difference, as it is never
# backtracked onto, whether or not it has a label.
/aaaaa(*SKIP)(*PRUNE)b|a+c/
aaaaaac
0: aaaac
/aaaaa(*SKIP:N)(*PRUNE)b|a+c/
aaaaaac
0: aaaac
/aaaa(*:N)a(*SKIP:N)(*PRUNE)b|a+c/
aaaaaac
0: aaaac
# Putting THEN in front makes no difference.
/aaaaa(*THEN)(*PRUNE)b|a+c/
aaaaaac
0: aaaac
# However, putting COMMIT in front of the prune changes it to "no match". I
# think this is inconsistent and possibly a bug. For the moment, running this
# test is moved out of the Perl-compatible file.
/aaaaa(*COMMIT)(*PRUNE)b|a+c/
# OK, lets play the same game again using SKIP instead of PRUNE.
# This matches "ac" because SKIP forces the next match to start on the
# sixth "a".
/aaaaa(*SKIP)b|a+c/
aaaaaac
0: ac
# Putting PRUNE in front makes no difference.
/aaaaa(*PRUNE)(*SKIP)b|a+c/
aaaaaac
0: ac
# Putting THEN in front makes no difference.
/aaaaa(*THEN)(*SKIP)b|a+c/
aaaaaac
0: ac
# In this case, neither does COMMIT. This still matches "ac".
/aaaaa(*COMMIT)(*SKIP)b|a+c/
aaaaaac
0: ac
# This gives "no match", as expected.
/aaaaa(*COMMIT)b|a+c/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaaaaac
No match
# ---- Tests using THEN ----
# This matches "aaaaaac", as expected.
/aaaaa(*THEN)b|a+c/
aaaaaac
0: aaaaaac
# Putting SKIP in front makes no difference.
/aaaaa(*SKIP)(*THEN)b|a+c/
aaaaaac
0: aaaaaac
# Putting PRUNE in front makes no difference.
/aaaaa(*PRUNE)(*THEN)b|a+c/
aaaaaac
0: aaaaaac
# Putting COMMIT in front makes no difference.
/aaaaa(*COMMIT)(*THEN)b|a+c/
aaaaaac
0: aaaaaac
# End of "priority" tests
/aaaaa(*:m)(*PRUNE:m)(*SKIP:m)m|a+/
aaaaaa
0: a
/aaaaa(*:m)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/
aaaaaa
0: a
/aaaaa(*:n)(*PRUNE:m)(*SKIP:m)m|a+/
aaaaaa
0: aaaa
/aaaaa(*:n)(*MARK:m)(*PRUNE)(*SKIP:m)m|a+/
aaaaaa
0: a
/a(*MARK:A)aa(*PRUNE:A)a(*SKIP:A)b|a+c/
aaaac
0: aac
/a(*MARK:A)aa(*MARK:A)a(*SKIP:A)b|a+c/
aaaac
0: ac
/aaa(*PRUNE:A)a(*SKIP:A)b|a+c/
aaaac
0: aac
/aaa(*MARK:A)a(*SKIP:A)b|a+c/
aaaac
0: ac
/a(*:m)a(*COMMIT)(*SKIP:m)b|a+c/mark
aaaaaac
0: ac
/.?(a|b(*THEN)c)/
ba
0: ba
1: a
/(a(*COMMIT)b)c|abd/
abc
0: abc
1: ab
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abd
No match
/(?=a(*COMMIT)b)abc|abd/
abc
0: abc
abd
0: abd
/(?>a(*COMMIT)b)c|abd/
abc
0: abc
abd
0: abd
/a(?=b(*COMMIT)c)[^d]|abd/
2015-09-16 18:49:48 +02:00
abc
0: ab
\= Expect no match
2014-07-24 18:32:38 +02:00
abd
No match
/a(?=bc).|abd/
abd
0: abd
abc
0: ab
/a(?>b(*COMMIT)c)d|abd/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abceabd
No match
/a(?>bc)d|abd/
abceabd
0: abd
/(?>a(*COMMIT)b)c|abd/
abd
0: abd
/(?>a(*COMMIT)c)d|abd/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abd
No match
/((?=a(*COMMIT)b)ab|ac){0}(?:(?1)|a(c))/
ac
0: ac
1: <unset>
2: c
# These tests were formerly in test 2, but changes in PCRE and Perl have
# made them compatible.
/^(a)?(?(1)a|b)+$/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
a
No match
/(?=a\Kb)ab/
ab
0: b
/(?!a\Kb)ac/
ac
0: ac
/^abc(?<=b\Kc)d/
abcd
0: cd
/^abc(?<!b\Kq)d/
abcd
0: abcd
/A(*PRUNE:A)A+(*SKIP:A)(B|Z) | AC/x,mark
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AAAC
No match, mark = A
/^((abc|abcx)(*THEN)y|abcd)/
abcd
0: abcd
1: abcd
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
abcxy
No match
/^((yes|no)(*THEN)(*F))?/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
yes
No match
/(A (.*) C? (*THEN) | A D) (*FAIL)/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) C? (*THEN) | A D) z/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) C? (*THEN) | A D) \s* (*FAIL)/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) C? (*THEN) | A D) \s* z/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) (?:C|) (*THEN) | A D) (*FAIL)/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) (?:C|) (*THEN) | A D) z/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) C{0,6} (*THEN) | A D) (*FAIL)/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) C{0,6} (*THEN) | A D) z/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) (CE){0,6} (*THEN) | A D) (*FAIL)/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCEBefgBhiBqz
No match
/(A (.*) (CE){0,6} (*THEN) | A D) z/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCEBefgBhiBqz
No match
/(A (.*) (CE*){0,6} (*THEN) | A D) (*FAIL)/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(A (.*) (CE*){0,6} (*THEN) | A D) z/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
AbcdCBefgBhiBqz
No match
/(?=a(*COMMIT)b|ac)ac|ac/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ac
No match
/(?=a(*COMMIT)b|(ac)) ac | (a)c/x
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
ac
No match
# ----
/(?(?!b(*THEN)a)bn|bnn)/
bnn
0: bn
/(?!b(*SKIP)a)bn|bnn/
bnn
0: bn
/(?(?!b(*SKIP)a)bn|bnn)/
bnn
0: bn
/(?!b(*PRUNE)a)bn|bnn/
bnn
0: bn
/(?(?!b(*PRUNE)a)bn|bnn)/
bnn
0: bn
/(?!b(*COMMIT)a)bn|bnn/
bnn
0: bn
/(?(?!b(*COMMIT)a)bn|bnn)/
bnn
0: bn
/(?=b(*SKIP)a)bn|bnn/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bnn
No match
/(?=b(*THEN)a)bn|bnn/
bnn
0: bnn
/^(?!a(*SKIP)b)/
ac
0:
/^(?!a(*SKIP)b)../
acd
0: ac
/(?!a(*SKIP)b)../
acd
0: ac
/^(?(?!a(*SKIP)b))/
ac
0:
/^(?!a(*PRUNE)b)../
acd
0: ac
/(?!a(*PRUNE)b)../
acd
0: ac
/(?!a(*COMMIT)b)ac|cd/
ac
0: ac
/\A.*?(?:a|bc)/
ba
0: ba
/^(A(*THEN)B|C(*THEN)D)/
CD
0: CD
1: CD
/(*:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
abc
0: b
MK: m(m
/(*PRUNE:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
abc
0: b
MK: m(m
/(*SKIP:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
abc
0: b
/(*THEN:m(m)(?&y)(?(DEFINE)(?<y>b))/mark
abc
0: b
MK: m(m
/^\d*\w{4}/
1234
0: 1234
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
123
No match
/^[^b]*\w{4}/
aaaa
0: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/^[^b]*\w{4}/i
aaaa
0: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/^a*\w{4}/
aaaa
0: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/^a*\w{4}/i
aaaa
0: aaaa
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
aaa
No match
/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
foofoo
0: foofoo
1: foo
barbar
0: barbar
1: <unset>
2: bar
/(?<n>A)(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
AfooA
0: AfooA
1: A
2: foo
AbarA
0: AbarA
1: A
2: <unset>
3: bar
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
Afoofoo
No match
Abarbar
No match
/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
1 IN SOA non-sp1 non-sp2(
0: 1 IN SOA non-sp1 non-sp2(
1: 1
2: non-sp1
3: non-sp2
/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?('A')x) (?(<B>)y)$/x,dupnames
Ax
0: Ax
1: A
BAxy
0: BAxy
1: <unset>
2: B
3: A
/^A\xZ/
A\0Z
0: A\x00Z
/^A\o{123}B/
A\123B
0: ASB
/ ^ a + + b $ /x
aaaab
0: aaaab
/ ^ a + #comment
+ b $ /x
aaaab
0: aaaab
/ ^ a + #comment
#comment
+ b $ /x
aaaab
0: aaaab
/ ^ (?> a + ) b $ /x
aaaab
0: aaaab
/ ^ ( a + ) + + \w $ /x
aaaab
0: aaaab
1: aaaa
/(?:a\Kb)*+/aftertext
ababc
0: b
0+ c
/(?>a\Kb)*/aftertext
ababc
0: b
0+ c
/(?:a\Kb)*/aftertext
ababc
0: b
0+ c
/(a\Kb)*+/aftertext
ababc
0: b
0+ c
1: ab
/(a\Kb)*/aftertext
ababc
0: b
0+ c
1: ab
/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
acb
No match
'\A(?:[^\"]++|\"(?:[^\"]*+|\"\")*+\")++'
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
0: NON QUOTED "QUOT""ED" AFTER
'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
0: NON QUOTED "QUOT""ED" AFTER
'\A(?:[^\"]++|\"(?:[^\"]++|\"\")++\")++'
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
0: NON QUOTED "QUOT""ED" AFTER
'\A([^\"1]++|[\"2]([^\"3]*+|[\"4][\"5])*+[\"6])++'
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
0: NON QUOTED "QUOT""ED" AFTER
1: AFTER
2:
/^\w+(?>\s*)(?<=\w)/
test test
0: tes
/(?P<same>a)(?P<same>b)/g,dupnames
abbaba
0: ab
1: a
2: b
0: ab
1: a
2: b
/(?P<same>a)(?P<same>b)(?P=same)/g,dupnames
abbaba
0: aba
1: a
2: b
/(?P=same)?(?P<same>a)(?P<same>b)/g,dupnames
abbaba
0: ab
1: a
2: b
0: ab
1: a
2: b
/(?:(?P=same)?(?:(?P<same>a)|(?P<same>b))(?P=same))+/g,dupnames
bbbaaabaabb
0: bbbaaaba
1: a
2: b
0: bb
1: <unset>
2: b
/(?:(?P=same)?(?:(?P=same)(?P<same>a)(?P=same)|(?P=same)?(?P<same>b)(?P=same)){2}(?P=same)(?P<same>c)(?P=same)){2}(?P<same>z)?/g,dupnames
2015-09-16 18:49:48 +02:00
\= Expect no match
2014-07-24 18:32:38 +02:00
bbbaaaccccaaabbbcc
No match
/(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/
acl
0: acl
1: a
bdl
0: bdl
1: <unset>
2: b
adl
0: dl
bcl
0: l
/\sabc/
\x{0b}abc
0: \x0babc
/[\Qa]\E]+/
aa]]
0: aa]]
/[\Q]a\E]+/
aa]]
0: aa]]
/A((((((((a))))))))\8B/
AaaB
0: AaaB
1: a
2: a
3: a
4: a
5: a
6: a
7: a
8: a
/A(((((((((a)))))))))\9B/
AaaB
0: AaaB
1: a
2: a
3: a
4: a
5: a
6: a
7: a
8: a
9: a
/A[\8\9]B/
A8B
0: A8B
A9B
0: A9B
2014-10-10 18:16:44 +02:00
/(|ab)*?d/
abd
0: abd
1: ab
xyd
0: d
2014-11-05 17:05:19 +01:00
/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
1234abcd
0:
1: <unset>
2: <unset>
3: <unset>
4: <unset>
5:
2015-01-28 12:28:53 +01:00
/(\2|a)(\1)/
aaa
0: aa
1: a
2: a
2015-02-08 18:05:12 +01:00
/(\2)(\1)/
2015-03-25 18:01:04 +01:00
"Z*(|d*){216}"
2015-03-29 13:15:32 +02:00
"(?1)(?#?'){8}(a)"
baaaaaaaaac
0: aaaaaaaaa
1: a
2015-04-23 19:28:39 +02:00
/((((((((((((x))))))))))))\12/
xx
0: xx
1: x
2: x
3: x
4: x
5: x
6: x
7: x
8: x
9: x
10: x
11: x
12: x
/A[\8]B[\9]C/
A8B9C
0: A8B9C
2015-05-06 18:51:25 +02:00
/(?1)()((((((\1++))\x85)+)|))/
\x85\x85
0: \x85\x85
1:
2: \x85\x85
3: \x85\x85
4: \x85\x85
5: \x85
6:
7:
2015-05-16 13:01:48 +02:00
"(?|(\k'Pm')|(?'Pm'))"
abcd
0:
1:
2015-08-03 15:18:49 +02:00
/(?|(aaa)|(b))\g{1}/
aaaaaa
0: aaaaaa
1: aaa
bb
0: bb
1: b
/(?|(aaa)|(b))(?1)/
aaaaaa
0: aaaaaa
1: aaa
baaa
0: baaa
1: b
2015-09-16 18:49:48 +02:00
\= Expect no match
2015-08-03 15:18:49 +02:00
bb
No match
/(?|(aaa)|(b))/
xaaa
0: aaa
1: aaa
xbc
0: b
1: b
/(?|(?'a'aaa)|(?'a'b))\k'a'/
aaaaaa
0: aaaaaa
1: aaa
bb
0: bb
1: b
/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames
aaaccccaaa
0: aaaccccaaa
1: aaa
2: cccc
bccccb
0: bccccb
1: b
2: cccc
2016-10-02 18:01:01 +02:00
# /x does not apply to MARK labels
/x (*MARK:ab cd # comment
ef) x/x,mark
axxz
0: xx
MK: ab cd # comment\x0aef
/(?<=a(B){0}c)X/
acX
0: X
/(?<DEFINE>b)(?(DEFINE)(a+))(?&DEFINE)/
bbbb
0: bb
1: b
\= Expect no match
baaab
No match
2016-10-18 13:22:40 +02:00
/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/
\ Fred:099
0:
/(?=.*X)X$/
\ X
0: X
2016-11-01 16:58:28 +01:00
/(?s)(?=.*?)b/
aabc
0: b
2016-12-10 15:59:24 +01:00
/(Z)(a)\2{1,2}?(?-i)\1X/i
ZaAAZX
0: ZaAAZX
1: Z
2: a
2016-12-21 18:09:11 +01:00
/(?'c')XX(?'YYYYYYYYYYYYYYYYYYYYYYYCl')/
2017-01-11 17:40:35 +01:00
/[s[:digit:]\E-H]+/
s09-H
0: s09-H
/[s[:digit:]\Q\E-H]+/
s09-H
0: s09-H
2017-02-08 18:03:30 +01:00
/a+(?:|b)a/
aaaa
0: aaaa
/X?(R||){3335}/
2017-03-09 17:23:28 +01:00
/(?1)(A(*COMMIT)|B)D/
ABD
0: ABD
1: B
XABD
0: ABD
1: B
BAD
0: BAD
1: A
ABXABD
0: ABD
1: B
\= Expect no match
ABX
No match
/(?(DEFINE)(?<m> 1? (?=(?<cond>2)?) 1 2 (?('cond')|3)))
\A
()
(?&m)
\Z/x
123
0: 123
1: <unset>
2: <unset>
3:
/^(?:
(?: A| (1? (?=(?<cond>2)?) (1) 2 (?('cond')|3)) )
(Z)
)+$/x
AZ123Z
0: AZ123Z
1: 123
2: <unset>
3: 1
4: Z
\= Expect no match
AZ12Z
No match
/^ (?(DEFINE) ( (?!(a)\2b)..) ) ()(?1) /x
acb
0: ac
1: <unset>
2: <unset>
3:
\= Expect no match
aab
No match
'(?>ab|abab){1,5}?M'
abababababababababababM
0: abababababM
'(?>ab|abab){2}?M'
abababM
0: ababM
'((?(?=(a))a)+k)'
bbak
0: ak
1: ak
2: a
'((?(?=(a))a|)+k)'
bbak
0: ak
1: ak
2: a
'(?(?!(b))a|b)+k'
ababbalbbadabak
0: abak
1: b
/(?!(b))c|b/
Ab
0: b
Ac
0: c
/(?=(b))b|c/
Ab
0: b
1: b
Ac
0: c
2017-03-24 19:40:15 +01:00
/^(.|(.)(?1)\2)$/
a
0: a
1: a
aba
0: aba
1: aba
2: a
abcba
0: abcba
1: abcba
2: a
ababa
0: ababa
1: ababa
2: a
abcdcba
0: abcdcba
1: abcdcba
2: a
/^((.)(?1)\2|.?)$/
a
0: a
1: a
aba
0: aba
1: aba
2: a
abba
0: abba
1: abba
2: a
abcba
0: abcba
1: abcba
2: a
ababa
0: ababa
1: ababa
2: a
abccba
0: abccba
1: abccba
2: a
abcdcba
0: abcdcba
1: abcdcba
2: a
abcddcba
0: abcddcba
1: abcddcba
2: a
/^(.)(\1|a(?2))/
bab
0: bab
1: b
2: ab
/^(.|(.)(?1)?\2)$/
abcba
0: abcba
1: abcba
2: a
2017-04-03 20:02:07 +02:00
/^(?(?=(a))abc|def)/
abc
0: abc
1: a
/^(?(?!(a))def|abc)/
abc
0: abc
1: a
/^(?(?=(a)(*ACCEPT))abc|def)/
abc
0: abc
1: a
/^(?(?!(a)(*ACCEPT))def|abc)/
abc
0: abc
1: a
2017-04-16 15:03:30 +02:00
/^(?1)\d{3}(a)/
a123a
0: a123a
1: a
2017-04-22 16:35:14 +02:00
# This pattern uses a lot of named subpatterns in order to match email
# addresses in various formats. It's a heavy test for named subpatterns. In the
# <atext> group, slash is coded as \x{2f} so that this pattern can also be
# processed by perltest.sh, which does not cater for an escaped delimiter
2017-06-12 19:48:03 +02:00
# within the pattern. $ within the pattern must also be escaped. All $ and @
# characters in subject strings are escaped so that Perl doesn't interpret them
# as variable insertions and " characters must also be escaped for Perl.
2017-04-22 16:35:14 +02:00
# This set of subpatterns is more or less a direct transliteration of the BNF
# definitions in RFC2822, without any of the obsolete features. The addition of
# a possessive + to the definition of <phrase> reduced the match limit in PCRE2
# from over 5 million to just under 400, and eliminated a very noticeable delay
# when this file was passed to perltest.sh.
/(?ix)(?(DEFINE)
(?<addr_spec> (?&local_part) \@ (?&domain) )
(?<angle_addr> (?&CFWS)?+ < (?&addr_spec) > (?&CFWS)?+ )
2017-06-12 19:48:03 +02:00
(?<atext> [a-z\d!#\$%&'*+-\x{2f}=?^_`{|}~] )
2017-04-22 16:35:14 +02:00
(?<atom> (?&CFWS)?+ (?&atext)+ (?&CFWS)?+ )
(?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment) )
(?<ctext> [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ ()\\] )
(?<comment> \( (?: (?&FWS)?+ (?&ccontent) )*+ (?&FWS)?+ \) )
(?<CFWS> (?: (?&FWS)?+ (?&comment) )* (?# NOT possessive)
(?: (?&FWS)?+ (?&comment) | (?&FWS) ) )
(?<dcontent> (?&dtext) | (?"ed_pair) )
(?<display_name> (?&phrase) )
(?<domain> (?&dot_atom) | (?&domain_literal) )
(?<domain_literal> (?&CFWS)?+ \[ (?: (?&FWS)?+ (?&dcontent) )* (?&FWS)?+ \]
(?&CFWS)?+ )
(?<dot_atom> (?&CFWS)?+ (?&dot_atom_text) (?&CFWS)?+ )
(?<dot_atom_text> (?&atext)++ (?: \. (?&atext)++)*+ )
(?<dtext> [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ \[\]\\] )
(?<FWS> (?: [\t\ ]*+ \n)?+ [\t\ ]++ )
(?<local_part> (?&dot_atom) | (?"ed_string) )
(?<mailbox> (?&name_addr) | (?&addr_spec) )
(?<name_addr> (?&display_name)? (?&angle_addr) )
(?<phrase> (?&word)++ )
(?<qcontent> (?&qtext) | (?"ed_pair) )
(?<quoted_pair> " (?&text) )
(?<quoted_string> (?&CFWS)?+ " (?: (?&FWS)?+ (?&qcontent))* (?&FWS)?+ "
(?&CFWS)?+ )
(?<qtext> [^\x{9}\x{10}\x{13}\x{7f}-\x{ff}\ "\\] )
(?<text> [^\r\n] )
(?<word> (?&atom) | (?"ed_string) )
) # End DEFINE
^(?&mailbox)$/
Alan Other <user\@dom.ain>
0: Alan Other <user@dom.ain>
<user\@dom.ain>
0: <user@dom.ain>
user\@dom.ain
0: user@dom.ain
user\@[]
0: user@[]
user\@[domain literal]
0: user@[domain literal]
user\@[domain literal with \"[square brackets\"] inside]
0: user@[domain literal with "[square brackets"] inside]
\"A. Other\" <user.1234\@dom.ain> (a comment)
0: "A. Other" <user.1234@dom.ain> (a comment)
A. Other <user.1234\@dom.ain> (a comment)
0: A. Other <user.1234@dom.ain> (a comment)
\"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
\= Expect no match
A missing angle <user\@some.where
No match
The quick brown fox
No match
# --------------------------------------------------------------------------
2017-06-12 19:48:03 +02:00
# This pattern uses named groups to match default PCRE2 patterns. It's another
# heavy test for named subpatterns. Once again, code slash as \x{2f} and escape
# $ even in classes so that this works with pcre2test.
/(?sx)(?(DEFINE)
(?<assertion> (?&simple_assertion) | (?&lookaround) )
(?<atomic_group> \( \? > (?®ex) \) )
(?<back_reference> \\ \d+ |
\\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) |
\\k <(?&groupname)> |
\\k '(?&groupname)' |
\\k \{ (?&groupname) \} |
\( \? P= (?&groupname) \) )
(?<branch> (?:(?&assertion) |
(?&callout) |
(?&comment) |
(?&option_setting) |
(?&qualified_item) |
(?"ed_string) |
(?"ed_string_empty) |
(?&special_escape) |
(?&verb)
)* )
(?<callout> \(\?C (?: \d+ |
(?: (?<D>["'`^%\#\$])
(?: \k'D'\k'D' | (?!\k'D') . )* \k'D' |
\{ (?: \}\} | [^}]*+ )* \} )
)? \) )
(?<capturing_group> \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )?
(?®ex) \) )
(?<character_class> \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )
(?<character_type> (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )
(?<class_item> (?: \[ : (?:
alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|
punct|space|upper|word|xdigit
) : \] |
(?"ed_string) |
(?"ed_string_empty) |
(?&escaped_character) |
(?&character_type) |
[^]] ) )
(?<comment> \(\?\# [^)]* \) | (?"ed_string_empty) | \\E )
(?<condition> (?: \( [+-]? \d+ \) |
\( < (?&groupname) > \) |
\( ' (?&groupname) ' \) |
\( R \d* \) |
\( R & (?&groupname) \) |
\( (?&groupname) \) |
\( DEFINE \) |
\( VERSION >?=\d+(?:\.\d\d?)? \) |
(?&callout)?+ (?&comment)* (?&lookaround) ) )
(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )
(?<delimited_regex> (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?®ex)
\k'delimiter' .* )
(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} |
x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} |
[aefnrt] | c[[:print:]] |
[^[:alnum:]] ) )
(?<group> (?&capturing_group) | (?&non_capturing_group) |
(?&resetting_group) | (?&atomic_group) |
(?&conditional_group) )
(?<groupname> [a-zA-Z_]\w* )
(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )
(?<lookaround> \(\? (?: = | ! | <= | <! ) (?®ex) \) )
(?<non_capturing_group> \(\? [iJmnsUx-]* : (?®ex) \) )
(?<option_setting> \(\? [iJmnsUx-]* \) )
(?<qualified_item> (?:\. |
(?&lookaround) |
(?&back_reference) |
(?&character_class) |
(?&character_type) |
(?&escaped_character) |
(?&group) |
(?&subroutine_call) |
(?&literal_character) |
(?"ed_string)
) (?&comment)? (?&qualifier)? )
(?<qualifier> (?: [?*+] | (?&range_qualifier) ) [+?]? )
(?<quoted_string> (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) )
(?<quoted_string_empty> \\Q\\E )
(?<range_qualifier> \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )
(?<regex> (?&start_item)* (?&branch) (?: \| (?&branch) )* )
(?<resetting_group> \( \? \| (?®ex) \) )
(?<simple_assertion> \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )
(?<special_escape> \\K )
(?<start_item> \( \* (?:
ANY |
ANYCRLF |
BSR_ANYCRLF |
BSR_UNICODE |
CR |
CRLF |
LF |
LIMIT_MATCH=\d+ |
LIMIT_DEPTH=\d+ |
LIMIT_HEAP=\d+ |
NOTEMPTY |
NOTEMPTY_ATSTART |
NO_AUTO_POSSESS |
NO_DOTSTAR_ANCHOR |
NO_JIT |
NO_START_OPT |
NUL |
UTF |
UCP ) \) )
(?<subroutine_call> (?: \(\?R\) | \(\?[+-]?\d+\) |
\(\? (?: & | P> ) (?&groupname) \) |
\\g < (?&groupname) > |
\\g ' (?&groupname) ' |
\\g < [+-]? \d+ > |
\\g ' [+-]? \d+ ) )
(?<verb> \(\* (?: ACCEPT | FAIL | F | COMMIT |
(?:MARK)?:(?&verbname) |
(?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )
(?<verbname> [^)]+ )
) # End DEFINE
# Kick it all off...
^(?&delimited_regex)$/subject_literal,jitstack=256
/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
0: /^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
0: /(cat(a(ract|tonic)|erpillar)) \1()2(3)/
/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
0: /^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
0: /^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
0: /<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
/^(?(DEFINE) (?<A> a) (?<B> b) ) (?&A) (?&B) /
0: /^(?(DEFINE) (?<A> a) (?<B> b) ) (?&A) (?&B) /
/(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
0: /(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))\b(?&byte)(\.(?&byte)){3}/
/\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
0: /\b(?&byte)(\.(?&byte)){3}(?(DEFINE)(?<byte>2[0-4]\d|25[0-5]|1\d\d|[1-9]?\d))/
/^(\w++|\s++)*$/
0: /^(\w++|\s++)*$/
/a+b?(*THEN)c+(*FAIL)/
0: /a+b?(*THEN)c+(*FAIL)/
/(A (A|B(*ACCEPT)|C) D)(E)/x
0: /(A (A|B(*ACCEPT)|C) D)(E)/x
/^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
0: /^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$/i
/A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
0: /A(*PRUNE)B(*SKIP)C(*THEN)D(*COMMIT)E(*F)F(*FAIL)G(?!)H(*ACCEPT)I/B
/(?C`a``b`)(?C'a''b')(?C"a""b")(?C^a^^b^)(?C%a%%b%)(?C#a##b#)(?C$a$$b$)(?C{a}}b})/B,callout_info
0: /(?C`a``b`)(?C'a''b')(?C"a""b")(?C^a^^b^)(?C%a%%b%)(?C#a##b#)(?C$a$$b$)(?C{a}}b})/B,callout_info
/(?sx)(?(DEFINE)(?<assertion> (?&simple_assertion) | (?&lookaround) )(?<atomic_group> \( \? > (?®ex) \) )(?<back_reference> \\ \d+ | \\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) | \\k <(?&groupname)> | \\k '(?&groupname)' | \\k \{ (?&groupname) \} | \( \? P= (?&groupname) \) )(?<branch> (?:(?&assertion) | (?&callout) | (?&comment) | (?&option_setting) | (?&qualified_item) | (?"ed_string) | (?"ed_string_empty) | (?&special_escape) | (?&verb) )* )(?<callout> \(\?C (?: \d+ | (?: (?<D>["'`^%\#\$]) (?: \k'D'\k'D' | (?!\k'D') . )* \k'D' | \{ (?: \}\} | [^}]*+ )* \} ) )? \) )(?<capturing_group> \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )? (?®ex) \) )(?<character_class> \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )(?<character_type> (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )(?<class_item> (?: \[ : (?: alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print| punct|space|upper|word|xdigit ) : \] | (?"ed_string) | (?"ed_string_empty) | (?&escaped_character) | (?&character_type) | [^]] ) )(?<comment> \(\?\# [^)]* \) | (?"ed_string_empty) | \\E )(?<condition> (?: \( [+-]? \d+ \) | \( < (?&groupname) > \) | \( ' (?&groupname) ' \) | \( R \d* \) | \( R & (?&groupname) \) | \( (?&groupname) \) | \( DEFINE \) | \( VERSION >?=\d+(?:\.\d\d?)? \) | (?&callout)?+ (?&comment)* (?&lookaround) ) )(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )(?<delimited_regex> (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?®ex) \k'delimiter' .* )(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} | x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} | [aefnrt] | c[[:print:]] | [^[:alnum:]] ) )(?<group> (?&capturing_group) | (?&non_capturing_group) | (?&resetting_group) | (?&atomic_group) | (?&conditional_group) )(?<groupname> [a-zA-Z_]\w* )(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )(?<lookaround> \(\? (?: = | ! | <= | <! ) (?®ex) \) )(?<non_capturing_group> \(\? [iJmnsUx-]* : (?®ex) \) )(?<option_setting> \(\? [iJmnsUx-]* \) )(?<qualified_item> (?:\. | (?&lookaround) | (?&back_reference) | (?&character_class) | (?&character_type) | (?&escaped_character) | (?&group) | (?&subroutine_call) | (?&literal_character) | (?"ed_string) ) (?&comment)? (?&qualifier)? )(?<qualifier> (?: [?*+] | (?&range_qualifier) ) [+?]? )(?<quoted_string> (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) ) (?<quoted_string_empty> \\Q\\E ) (?<range_qualifier> \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )(?<regex> (?&start_item)* (?&branch) (?: \| (?&branch) )* )(?<resetting_group> \( \? \| (?®ex) \) )(?<simple_assertion> \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )(?<special_escape> \\K )(?<start_item> \( \* (?: ANY | ANYCRLF | BSR_ANYCRLF | BSR_UNICODE | CR | CRLF | LF | LIMIT_MATCH=\d+ | LIMIT_DEPTH=\d+ | LIMIT_HEAP=\d+ | NOTEMPTY | NOTEMPTY_ATSTART | NO_AUTO_POSSESS | NO_DOTSTAR_ANCHOR | NO_JIT | NO_START_OPT | NUL | UTF | UCP ) \) )(?<subroutine_call> (?: \(\?R\) | \(\?[+-]?\d+\) | \(\? (?: & | P> ) (?&groupname) \) | \\g < (?&groupname) > | \\g ' (?&groupname) ' | \\g < [+-]? \d+ > | \\g ' [+-]? \d+ ) )(?<verb> \(\* (?: ACCEPT | FAIL | F | COMMIT | (?:MARK)?:(?&verbname) | (?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )(?<verbname> [^)]+ ))^(?&delimited_regex)$/
0: /(?sx)(?(DEFINE)(?<assertion> (?&simple_assertion) | (?&lookaround) )(?<atomic_group> \( \? > (?®ex) \) )(?<back_reference> \\ \d+ | \\g (?: [+-]?\d+ | \{ (?: [+-]?\d+ | (?&groupname) ) \} ) | \\k <(?&groupname)> | \\k '(?&groupname)' | \\k \{ (?&groupname) \} | \( \? P= (?&groupname) \) )(?<branch> (?:(?&assertion) | (?&callout) | (?&comment) | (?&option_setting) | (?&qualified_item) | (?"ed_string) | (?"ed_string_empty) | (?&special_escape) | (?&verb) )* )(?<callout> \(\?C (?: \d+ | (?: (?<D>["'`^%\#\$]) (?: \k'D'\k'D' | (?!\k'D') . )* \k'D' | \{ (?: \}\} | [^}]*+ )* \} ) )? \) )(?<capturing_group> \( (?: \? P? < (?&groupname) > | \? ' (?&groupname) ' )? (?®ex) \) )(?<character_class> \[ \^?+ (?: \] (?&class_item)* | (?&class_item)+ ) \] )(?<character_type> (?! \\N\{\w+\} ) \\ [dDsSwWhHvVRN] )(?<class_item> (?: \[ : (?: alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print| punct|space|upper|word|xdigit ) : \] | (?"ed_string) | (?"ed_string_empty) | (?&escaped_character) | (?&character_type) | [^]] ) )(?<comment> \(\?\# [^)]* \) | (?"ed_string_empty) | \\E )(?<condition> (?: \( [+-]? \d+ \) | \( < (?&groupname) > \) | \( ' (?&groupname) ' \) | \( R \d* \) | \( R & (?&groupname) \) | \( (?&groupname) \) | \( DEFINE \) | \( VERSION >?=\d+(?:\.\d\d?)? \) | (?&callout)?+ (?&comment)* (?&lookaround) ) )(?<conditional_group> \(\? (?&condition) (?&branch) (?: \| (?&branch) )? \) )(?<delimited_regex> (?<delimiter> [-\x{2f}!"'`=_:;,%&@~]) (?®ex) \k'delimiter' .* )(?<escaped_character> \\ (?: 0[0-7]{1,2} | [0-7]{1,3} | o\{ [0-7]+ \} | x \{ (*COMMIT) [[:xdigit:]]* \} | x [[:xdigit:]]{0,2} | [aefnrt] | c[[:print:]] | [^[:alnum:]] ) )(?<group> (?&capturing_group) | (?&non_capturing_group) | (?&resetting_group) | (?&atomic_group) | (?&conditional_group) )(?<groupname> [a-zA-Z_]\w* )(?<literal_character> (?! (?&range_qualifier) ) [^[()|*+?.\$\\] )(?<lookaround> \(\? (?: = | ! | <= | <! ) (?®ex) \) )(?<non_capturing_group> \(\? [iJmnsUx-]* : (?®ex) \) )(?<option_setting> \(\? [iJmnsUx-]* \) )(?<qualified_item> (?:\. | (?&lookaround) | (?&back_reference) | (?&character_class) | (?&character_type) | (?&escaped_character) | (?&group) | (?&subroutine_call) | (?&literal_character) | (?"ed_string) ) (?&comment)? (?&qualifier)? )(?<qualifier> (?: [?*+] | (?&range_qualifier) ) [+?]? )(?<quoted_string> (?: \\Q (?: (?!\\E | \k'delimiter') . )++ (?: \\E | ) ) ) (?<quoted_string_empty> \\Q\\E ) (?<range_qualifier> \{ (?: \d+ (?: , \d* )? | , \d+ ) \} )(?<regex> (?&start_item)* (?&branch) (?: \| (?&branch) )* )(?<resetting_group> \( \? \| (?®ex) \) )(?<simple_assertion> \^ | \$ | \\A | \\b | \\B | \\G | \\z | \\Z )(?<special_escape> \\K )(?<start_item> \( \* (?: ANY | ANYCRLF | BSR_ANYCRLF | BSR_UNICODE | CR | CRLF | LF | LIMIT_MATCH=\d+ | LIMIT_DEPTH=\d+ | LIMIT_HEAP=\d+ | NOTEMPTY | NOTEMPTY_ATSTART | NO_AUTO_POSSESS | NO_DOTSTAR_ANCHOR | NO_JIT | NO_START_OPT | NUL | UTF | UCP ) \) )(?<subroutine_call> (?: \(\?R\) | \(\?[+-]?\d+\) | \(\? (?: & | P> ) (?&groupname) \) | \\g < (?&groupname) > | \\g ' (?&groupname) ' | \\g < [+-]? \d+ > | \\g ' [+-]? \d+ ) )(?<verb> \(\* (?: ACCEPT | FAIL | F | COMMIT | (?:MARK)?:(?&verbname) | (?:PRUNE|SKIP|THEN) (?: : (?&verbname)? )? ) \) )(?<verbname> [^)]+ ))^(?&delimited_regex)$/
\= Expect no match
/((?(?C'')\QX\E(?!((?(?C'')(?!X=X));=)r*X=X));=)/
No match
/(?:(?(2y)a|b)(X))+/
No match
/a(*MARK)b/
No match
/a(*CR)b/
No match
/(?P<abn>(?P=abn)(?<badstufxxx)/
No match
# --------------------------------------------------------------------------
2014-07-24 18:32:38 +02:00
# End of testinput1