Template
1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo synced 2024-11-25 03:06:10 +01:00
forgejo/vendor/github.com/dlclark/regexp2/testoutput1
mrsdizzie af7ffaa279
Server-side syntax highlighting for all code (#12047)
* Server-side syntax hilighting for all code

This PR does a few things:

* Remove all traces of highlight.js
* Use chroma library to provide fast syntax hilighting directly on the server
* Provide syntax hilighting for diffs
* Re-style both unified and split diffs views
* Add custom syntax hilighting styling for both regular and arc-green

Fixes #7729
Fixes #10157
Fixes #11825
Fixes #7728
Fixes #3872
Fixes #3682

And perhaps gets closer to #9553

* fix line marker

* fix repo search

* Fix single line select

* properly load settings

* npm uninstall highlight.js

* review suggestion

* code review

* forgot to call function

* fix test

* Apply suggestions from code review

suggestions from @silverwind thanks

Co-authored-by: silverwind <me@silverwind.io>

* code review

* copy/paste error

* Use const for highlight size limit

* Update web_src/less/_repository.less

Co-authored-by: Lauris BH <lauris@nix.lv>

* update size limit to 1MB and other styling tweaks

* fix highlighting for certain diff sections

* fix test

* add worker back as suggested

Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: Lauris BH <lauris@nix.lv>
2020-07-01 00:34:03 +03:00

7062 lines
106 KiB
Plaintext
Vendored
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
#newline_default lf any anycrlf
#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
\= Expect no match
The quick brown FOX
No match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
fthing
No match
[thing
No match
\\thing
No match
/^[]cde]/
]thing
0: ]
cthing
0: c
dthing
0: d
ething
0: e
\= Expect no match
athing
No match
fthing
No match
/^[^ab\]cde]/
fthing
0: f
[thing
0: [
\\thing
0: \
\= Expect no match
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
\= Expect no match
]thing
No match
cthing
No match
dthing
No match
ething
No match
# DLC - I don't get this one
#/^\/
# 
# 0: \x81
#updated to handle 16-bits utf8
/^ÿ/
ÿ
0: \xc3\xbf
/^[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
\= Expect no match
abc
No match
/^.*nter/
enter
0: enter
inter
0: inter
uponter
0: uponter
/^xxx[0-9]+$/
xxx0
0: xxx0
xxx1234
0: xxx1234
\= Expect no match
xxx
No match
/^.+[0-9][0-9][0-9]$/
x123
0: x123
x1234
0: x1234
xx123
0: xx123
123456
0: 123456
\= Expect no match
123
No match
/^.+?[0-9][0-9][0-9]$/
x123
0: x123
x1234
0: x1234
xx123
0: xx123
123456
0: 123456
\= Expect no match
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
\= Expect no match
!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: :
\= Expect no match
Fail without a colon
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
\= Expect no match
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
\= Expect no match
.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
\= Expect no match
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-
\= Expect no match
-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
\= Expect no match
*.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
\= Expect no match
\"1234\" : things
No match
/^$/
\
0:
\= Expect no match
A non-empty line
No match
/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
ab c
0: ab c
\= Expect no match
abc
No match
ab cde
No match
/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
ab c
0: ab c
\= Expect no match
abc
No match
ab cde
No match
/^ a\ b[c ]d $/x
a bcd
0: a bcd
a b d
0: a b d
\= Expect no match
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__
\= Expect no match
1234567
No match
/^[aeiou\d]{4,5}$/
uoie
0: uoie
1234
0: 1234
12345
0: 12345
aaaaa
0: aaaaa
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
abc
No match
/(?=^)abc/
abc
0: abc
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
#.NET doesn't do octal with 1 number
/^(cow|)\1(bell)/
cowcowbell
0: cowcowbell
1: cow
2: bell
bell
0: bell
1:
2: bell
\= Expect no match
cowbell
No match
/^\s/
\040abc
0:
\x0cabc
0: \x0c
\nabc
0: \x0a
\rabc
0: \x0d
\tabc
0: \x09
\= Expect no match
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:
\= Expect no match
acb
No match
/^(a|)\1+b/
aab
0: aab
1: a
aaaab
0: aaaab
1: a
b
0: b
1:
\= Expect no match
ab
No match
/^(a|)\1?b/
ab
0: ab
1: a
aab
0: aab
1: a
b
0: b
1:
\= Expect no match
acb
No match
/^(a|)\1{2}b/
aaab
0: aaab
1: a
b
0: b
1:
\= Expect no match
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:
\= Expect no match
ab
No match
aab
No match
aaaaab
No match
/ab{1,3}bc/
abbbbc
0: abbbbc
abbbc
0: abbbc
abbc
0: abbc
\= Expect no match
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
\= Expect no match
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
\= Expect no match
qqq\nabc
No match
abc\nzzz
No match
qqq\nabc\nzzz
No match
/\Aabc\Z/m
abc
0: abc
abc\n
0: abc
\= Expect no match
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
\= Expect no match
abc\ndef
No match
/(?:b)|(?::+)/
b::c
0: b
c::b
0: ::
/[-az]+/
az-
0: az-
\= Expect no match
b
No match
/[az-]+/
za-
0: za-
\= Expect no match
b
No match
/[a\-z]+/
a-z
0: a-z
\= Expect no match
b
No match
/[a-z]+/
abcdxyz
0: abcdxyz
/[\d-]+/
12-34
0: 12-34
\= Expect no match
aaa
No match
/[\d-z]+/
12-34z
0: 12-34z
\= Expect no match
aaa
No match
/\x5c/
\\
0: \
/\x20Z/
the Zoo
0: Z
\= Expect no match
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
\= Expect no match
abc\ndef
No match
/(abc)\123/
abc\x53
0: abcS
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)(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
\= Expect no match
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
\= Expect no match
abk
No match
/[^k]{2,3}$/
abc
0: abc
kbc
0: bc
kabc
0: abc
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
# trimmed upper ascii since Go is UTF-8
/\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/
\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
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
/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
\= Expect no match
1.235
No match
/\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
\= Expect no match
ABC123
No match
/^[W-]46]/
W46]789
0: W46]
-46]789
0: -46]
\= Expect no match
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: \
\= Expect no match
-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/
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
\= Expect no match
word cat dog elephant mussel cow horse canary baboon snake shark
No match
/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
\= 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
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
\= Expect no match
bcd
No match
/^(a){1,2}/
abc
0: a
1: a
aab
0: aa
1: a
\= Expect no match
bcd
No match
/^(a){1,3}/
abc
0: a
1: a
aab
0: aa
1: a
aaa
0: aaa
1: a
\= Expect no match
bcd
No match
/^(a){1,}/
abc
0: a
1: a
aab
0: aa
1: a
aaa
0: aaa
1: a
aaaaaaaa
0: aaaaaaaa
1: a
\= Expect no match
bcd
No match
/.*\.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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
abcde\nBar
No match
/(?s:.*X|^B)/
abcde\n1234Xyz
0: abcde\x0a1234X
BarFoo
0: B
\= Expect no match
abcde\nBar
No match
/^.*B/
\= Expect no match
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
\= Expect no match
z
No match
/abcde{0,0}/
abcd
0: abcd
\= Expect no match
abce
No match
/ab[cd]{0,0}e/
abe
0: abe
\= Expect no match
abcde
No match
/ab(c){0,0}d/
abd
0: abd
\= Expect no match
abcd
No match
/a(b*)/
a
0: a
1:
ab
0: ab
1: b
abbbb
0: abbbb
1: bbbb
\= Expect no match
bbbbb
No match
/ab\d{0}e/
abe
0: abe
\= Expect no match
ab1e
No match
/"([^\\"]+|\\.)*"/
the \"quick\" brown fox
0: "quick"
1: quick
\"the \\\"quick\\\" brown fox\"
0: "the \"quick\" brown fox"
1: brown fox
/<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
\= Expect no match
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
a\bx\n
0: x
a\nx\n
0: x
\= Expect no match
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
\= Expect no match
barfoo
No match
towbarfoo
No match
/\w{3}(?<!bar)foo/
catfood
0: catfoo
\= Expect no match
foo
No match
barfoo
No match
towbarfoo
No match
/(?<=(foo)a)bar/
fooabar
0: bar
1: foo
\= Expect no match
bar
No match
foobbar
No match
/\Aabc\z/m
abc
0: abc
\= Expect no match
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
\= Expect no match
/this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
No match
/(?>(\.\d\d[1-9]?))\d+/
1.230003938
0: .230003938
1: .23
1.875000282
0: .875000282
1: .875
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
/a(?-i)b/i
ab
0: ab
Ab
0: Ab
\= Expect no match
aB
No match
AB
No match
/(a (?x)b c)d e/
a bcd e
0: a bcd e
1: a bc
\= Expect no match
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
\= Expect no match
abcdef
No match
/(a(?i)b)c/
abc
0: abc
1: ab
aBc
0: aBc
1: aB
\= Expect no match
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
\= Expect no match
ABC
No match
abC
No match
aBC
No match
/a(?i:b)*c/
aBc
0: aBc
aBBc
0: aBBc
\= Expect no match
aBC
No match
aBBC
No match
/a(?=b(?i)c)\w\wd/
abcd
0: abcd
abCd
0: abCd
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
Abc
No match
abAb
No match
abbC
No match
/(?=a(?i)b)\w\wc/
abc
0: abc
aBc
0: aBc
\= Expect no match
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
\= Expect no match
Abxxc
No match
ABxxc
No match
abxxC
No match
/(?:(a)|b)(?(1)A|B)/
aA
0: aA
1: a
bB
0: bB
\= Expect no match
aB
No match
bA
No match
/^(a)?(?(1)a|b)+$/
aa
0: aa
1: a
b
0: b
bb
0: bb
\= Expect no match
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
\= Expect no match
xyz
No match
/^(?(?!abc)\d\d|\w{3}:)$/
abc:
0: abc:
12
0: 12
\= Expect no match
123
No match
xyz
No match
/(?(?<=foo)bar|cat)/
foobar
0: bar
cat
0: cat
fcat
0: cat
focat
0: cat
\= Expect no match
foocat
No match
/(?(?<!foo)cat|bar)/
foobar
0: bar
cat
0: cat
fcat
0: cat
focat
0: cat
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
sep-12-98
No match
/(?<=(foo))bar\1/
foobarfoo
0: barfoo
1: foo
foobarfootling
0: barfoo
1: foo
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
aCD
No match
XY
No match
/(?<=foo\n)^bar/m
foo\nbar
0: bar
\= Expect no match
bar
No match
baz\nbar
No match
/(?<=(?<!foo)bar)baz/
barbaz
0: baz
barbarbaz
0: baz
koobarbaz
0: baz
\= Expect no match
baz
No match
foobarbaz
No match
# 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.
/^(a\1?){4}$/
aaaaa
0: aaaaa
1: a
aaaaaaa
0: aaaaaaa
1: a
aaaaaaaaaa
0: aaaaaaaaaa
1: aaaa
\= Expect no match
a
No match
aa
No match
aaa
No match
aaaaaaaa
No match
aaaaaaaaa
No match
aaaaaaaaaaa
No match
aaaaaaaaaaaa
No match
aaaaaaaaaaaaa
No match
aaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaaa
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
\= Expect no match
a
No match
aa
No match
aaa
No match
aaaaaaaa
No match
aaaaaaaaa
No match
aaaaaaaaaaa
No match
aaaaaaaaaaaa
No match
aaaaaaaaaaaaa
No match
aaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaa
No match
aaaaaaaaaaaaaaaa
No match
# 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.
/abc/
abc
0: abc
xabcy
0: abc
ababc
0: abc
\= Expect no match
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
\= Expect no match
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/
\= Expect no match
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
\= Expect no match
abbbbc
No match
abcc
No match
/^abc/
abcc
0: abc
/^abc$/
/abc$/
aabc
0: abc
\= Expect no match
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
\= Expect no match
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
\= Expect no match
abd
No match
abd
No match
/a[^-b]c/
adc
0: adc
/a[^]b]c/
adc
0: adc
a-c
0: a-c
\= Expect no match
a]c
No match
/\ba\b/
a-
0: a
-a
0: a
-a-
0: a
/\by\b/
\= Expect no match
xy
No match
yz
No match
xyz
No match
/\Ba\B/
\= Expect no match
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: -
\= Expect no match
a
No match
/a\sb/
a b
0: a b
/a\Sb/
a-b
0: a-b
\= Expect no match
a b
No match
/\d/
1
0: 1
/\D/
-
0: -
\= Expect no match
1
No match
/[\w]/
a
0: a
/[\W]/
-
0: -
\= Expect no match
a
No match
/a[\s]b/
a b
0: a b
/a[\S]b/
a-b
0: a-b
\= Expect no match
a b
No match
/[\d]/
1
0: 1
/[\D]/
-
0: -
\= Expect no match
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/
\= Expect no match
b
No match
/a*/
\
0:
/([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/
\= Expect no match
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
\= Expect no match
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/
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
AXYZD
No match
/a[bc]d/i
ABD
0: ABD
/a[b-d]e/i
ACE
0: ACE
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
AB
No match
aaaaaaaaa
No match
aaaaaaaaaaa
No match
/^(a(?(1)\1)){4}$/
aaaaaaaaaa
0: aaaaaaaaaa
1: aaaa
\= Expect no match
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
\= Expect no match
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/
\= Expect no match
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/
\= Expect no match
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
\= Expect no match
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
\= Expect no match
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
\= Expect no match
Ab
No match
AB
No match
/((?-i:a))b/i
/((?-i:a.))b/i
\= Expect no match
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/
\= Expect no match
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
\= Expect no match
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/
\= Expect no match
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)/
\= Expect no match
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
\= Expect no match
a
No match
blah)
No match
(blah
No match
/^(\(+)?blah(?(1)(\)))$/
(blah)
0: (blah)
1: (
2: )
blah
0: blah
\= Expect no match
blah)
No match
(blah
No match
/(?(?!a)a|b)/
/(?(?!a)b|a)/
a
0: a
/(?(?=a)b|a)/
\= Expect no match
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/
\= Expect no match
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
\= Expect no match
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/
\= Expect no match
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:
\= Expect no match
\
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
\= Expect no match
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
\= Expect no match
word cat dog elephant mussel cow horse canary baboon snake shark
No match
/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
\= 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
No match
/(?<=\d{3}(?!999))foo/
999foo
0: foo
123999foo
0: foo
\= Expect no match
123abcfoo
No match
/(?<=(?!...999)\d{3})foo/
999foo
0: foo
123999foo
0: foo
\= Expect no match
123abcfoo
No match
/(?<=\d{3}(?!999)...)foo/
123abcfoo
0: foo
123456foo
0: foo
\= Expect no match
123999foo
No match
/(?<=\d{3}...)(?<!999)foo/
123abcfoo
0: foo
123456foo
0: foo
\= Expect no match
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:
/^[\d-a]/
abcde
0: a
-things
0: -
0digit
0: 0
\= Expect no match
bcdef
No match
/[\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
a\nxb\n
0: x
/(?!^)x/m
\= Expect no match
a\nxb\n
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
#\= Expect no match
# 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
\= Expect no match
xyzabc
No match
/a(?x: b c )d/
XabcdY
0: abcd
\= Expect no match
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
\= Expect no match
XabcY
No match
/((?i)AB(?-i)C|D)E/
abCE
0: abCE
1: abC
DE
0: DE
1: D
\= Expect no match
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:
\= Expect no match
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: ]
#\= Expect no match
# b
#No match
#TODO: PCRE has an optimization to make this workable, .NET does not
#/(a+)*b/
#\= Expect no match
# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#No match
# All these had to be updated because we understand unicode
# and this looks like it's expecting single byte matches
# .NET generates \xe4...not sure what's up, might just be different code pages
/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
REGular
0: REGular
regulaer
0: regulaer
Regex
0: Regex
regulär
0: regul\xc3\xa4r
#/Åæåä[à-ÿÀ-ß]+/
# Åæåäà
# 0: \xc5\xe6\xe5\xe4\xe0
# Åæåäÿ
# 0: \xc5\xe6\xe5\xe4\xff
# ÅæåäÀ
# 0: \xc5\xe6\xe5\xe4\xc0
# Åæåäß
# 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
\= Expect no match
abcddefg
No match
/(?<![^f]oo)(bar)/
foobarX
0: bar
1: bar
\= Expect no match
boobarX
No match
/(?<![^f])X/
offX
0: X
\= Expect no match
onyX
No match
/(?<=[^f])X/
onyX
0: X
\= Expect no match
offX
No match
/(?:(?(1)a|b)(X))+/
bXaX
0: bXaX
1: X
/(?:(?(1)\1a|b)(X|Y))+/
bXXaYYaY
0: bXXaYYaY
1: Y
bXYaXXaX
0: bX
1: X
# TODO: I think this is a difference caused by the
# collision of group numbers, but not sure
#/()()()()()()()()()(?:(?(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: #
\= Expect no match
#
No match
"(?x-is)(?:(?-ixs) \s*#\s*) include"
A #include
0: #include
\= Expect no match
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
#\= Expect no match
# E
#No match
#/^[a-\Ec]/
# b
# 0: b
#\= Expect no match
# -
#No match
# E
#No match
#/^[a\E\E-\Ec]/
# b
# 0: b
#\= Expect no match
# -
#No match
# E
#No match
#/^[\E\Qa\E-\Qz\E]+/
# b
# 0: b
#\= Expect no match
# -
#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:
# this is really long with debug -- removing for now
#/(a|)*\d/
# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
# 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
# 1:
#\= Expect no match
# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#No match
/(?>a|)*\d/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
\= Expect no match
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
/(?:a|)*\d/
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4
\= Expect no match
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
No match
/^(?s)(?>.*)(?<!\n)/
abc
0: abc
\= Expect no match
abc\n
No match
/^(?![^\n]*\n\z)/
abc
0:
\= Expect no match
abc\n
No match
/\z(?<!\n)/
abc
0:
\= Expect no match
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]/
\= Expect no match
fooabcfoo
No match
/(?(?=.*b)b|^)/
adc
0:
abc
0: b
/(?(?=^.*b)b|^)/
adc
0:
\= Expect no match
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
\= Expect no match
XABX
No match
/[\x00-\xff\s]+/
\x0a\x0b\x0c\x0d
0: \x0a\x0b\x0c\x0d
/(abc)\1/i
\= Expect no match
abc
No match
/(abc)\1/
\= Expect no match
abc
No match
/[^a]*/i
12abc
0: 12
12ABC
0: 12
#Posses
/[^a]*/i
12abc
0: 12
12ABC
0: 12
/[^a]*?X/i
\= Expect no match
12abc
No match
12ABC
No match
/[^a]+?X/i
\= Expect no match
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]{2,3}/i
abcdef
0: bcd
ABCDEF
0: BCD
/[^a]{2,3}?/i
abcdef
0: bc
ABCDEF
0: BC
/((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: <unset>
2: a
3: ac
/(?>(?>(a))b|(a)c)/
ac
0: ac
1: <unset>
2: a
/((?>(a+)b)+(aabab))/
aaaabaaabaabab
0: aaaabaaabaabab
1: aaaabaaabaabab
2: aaa
3: aabab
/(?>a+|ab)+?c/
\= Expect no match
aabc
No match
/(?>a+|ab)+c/
\= Expect no match
aabc
No match
/(?:a+|ab)+c/
aabc
0: aabc
/^(?:a|ab)+c/
aaaabc
0: aaaabc
/(?=abc){0}xyz/
xyz
0: xyz
/(?=abc){1}xyz/
\= Expect no match
xyz
No match
/(?=(a))?./
ab
0: a
1: a
bc
0: b
/(?=(a))??./
ab
0: a
bc
0: b
/^(?!a){0}\w+/
aaaaa
0: aaaaa
/(?<=(abc))?xyz/
abcxyz
0: xyz
1: abc
pqrxyz
0: xyz
/^[g<a>]+/
ggg<<<aaa>>>
0: ggg<<<aaa>>>
\= Expect no match
\\ga
No match
/^[ga]+/
gggagagaxyz
0: gggagaga
/[:a]xxx[b:]/
:xxx:
0: :xxx:
/(?<=a{2})b/i
xaabc
0: b
\= Expect no match
xabc
No match
/(?<!a{2})b/i
xabc
0: b
\= Expect no match
xaabc
No match
/(?<=[^a]{2})b/
axxbc
0: b
aAAbc
0: b
\= Expect no match
xaabc
No match
/(?<=[^a]{2})b/i
axxbc
0: b
\= Expect no match
aAAbc
No match
xaabc
No match
#/(?|(abc)|(xyz))\1/
# abcabc
# 0: abcabc
# 1: abc
# xyzxyz
# 0: xyzxyz
# 1: xyz
#\= Expect no match
# abcxyz
#No match
# xyzabc
#No match
#/(?|(abc)|(xyz))(?1)/
# abcabc
# 0: abcabc
# 1: abc
# xyzabc
# 0: xyzabc
# 1: xyz
#\= Expect no match
# 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
\= Expect no match
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
# .NET has more consistent grouping numbers with these dupe groups for the two options
/(?: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: "
2: <unset>
3: "
\= Expect no match
b\"11111
No match
#/(?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
# Check the use of names for failure
# Check opening parens in comment when seeking forward reference.
#/(?P<abn>(?P=abn)xxx|)+/
# xxx
# 0:
# 1:
#Posses
/^(a)?(\w)/
aaaaX
0: aa
1: a
2: a
YZ
0: Y
1: <unset>
2: Y
#Posses
/^(?:a)?(\w)/
aaaaX
0: aa
1: a
YZ
0: Y
1: Y
/\A.*?(a|bc)/
ba
0: ba
1: a
/\A.*?(?:a|bc|d)/
ba
0: ba
# --------------------------
/(another)?(\1?)test/
hello world test
0: test
1: <unset>
2:
/(another)?(\1+)test/
\= Expect no match
hello world test
No match
/((?: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
\= Expect no match
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"
\= Expect no match
abcdfooxyz
No match
"(?>.*?)foo"
abcdfooxyz
0: foo
# 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.
/a(?=bc).|abd/
abd
0: abd
abc
0: ab
/a(?>bc)d|abd/
abceabd
0: abd
# These tests were formerly in test 2, but changes in PCRE and Perl have
# made them compatible.
/^(a)?(?(1)a|b)+$/
\= Expect no match
a
No match
# ----
/^\d*\w{4}/
1234
0: 1234
\= Expect no match
123
No match
/^[^b]*\w{4}/
aaaa
0: aaaa
\= Expect no match
aaa
No match
/^[^b]*\w{4}/i
aaaa
0: aaaa
\= Expect no match
aaa
No match
/^a*\w{4}/
aaaa
0: aaaa
\= Expect no match
aaa
No match
/^a*\w{4}/i
aaaa
0: aaaa
\= Expect no match
aaa
No match
/(?:(?<n>foo)|(?<n>bar))\k<n>/dupnames
foofoo
0: foofoo
1: foo
barbar
0: barbar
1: bar
# A notable difference between PCRE and .NET. According to
# the PCRE docs:
# If you make a subroutine call to a non-unique named
# subpattern, the one that corresponds to the first
# occurrence of the name is used. In the absence of
# duplicate numbers (see the previous section) this is
# the one with the lowest number.
# .NET takes the most recently captured number according to MSDN:
# A backreference refers to the most recent definition of
# a group (the definition most immediately to the left,
# when matching left to right). When a group makes multiple
# captures, a backreference refers to the most recent capture.
#/(?<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
#\= Expect no match
# 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
# TODO: .NET's group number ordering here in the second example is a bit odd
/^ (?:(?<A>A)|(?'B'B)(?<A>A)) (?(A)x) (?(B)y)$/x,dupnames
Ax
0: Ax
1: A
BAxy
0: BAxy
1: A
2: B
/ ^ 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
/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/
\= Expect no match
acb
No match
#Posses
#/\A(?:[^\"]+|\"(?:[^\"]*|\"\")*\")+/
# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
# 0: NON QUOTED "QUOT""ED" AFTER
#Posses
#/\A(?:[^\"]+|\"(?:[^\"]+|\"\")*\")+/
# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
# 0: NON QUOTED "QUOT""ED" AFTER
#Posses
#/\A(?:[^\"]+|\"(?:[^\"]+|\"\")+\")+/
# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
# 0: NON QUOTED "QUOT""ED" AFTER
#Posses
#/\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<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/
\x0babc
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
/(|ab)*?d/
abd
0: abd
1: ab
xyd
0: d
/(\2|a)(\1)/
aaa
0: aa
1: a
2: a
/(\2)(\1)/
"Z*(|d*){216}"
/((((((((((((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
#"(?|(\k'Pm')|(?'Pm'))"
# abcd
# 0:
# 1:
#/(?|(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
#\= Expect no match
# 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
# End of testinput1