]{0,})>]{0,})>([\\d]{0,}\\.)(.*)(( ([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,}))<\\/a><\\/TD> | ]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD> | ]{0,})>([\\w\\W\\s\\d][^<>]{0,})<\\/TD><\\/TR>";
62 | executeRegex(regex, text, true);
63 | })
64 | // add listeners
65 | .on("cycle", (event) => {
66 | console.log(String(event.target));
67 | })
68 | // run async
69 | .run({ async: true });
70 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "assemblyscript-regex",
3 | "version": "0.1.0",
4 | "description": "A regex engine built with AssemblyScript",
5 | "ascMain": "assembly/index.ts",
6 | "main": "assembly/index.ts",
7 | "scripts": {
8 | "pretest": "npm run test:generate && npm run asbuild:untouched && npm run asbuild:empty",
9 | "test": "npm run prettier && npm run eslint && npm run asp && npm run test:empty",
10 | "test:empty": "diff build/empty.wat assembly/__tests__/empty.wat",
11 | "test:generate": "node spec/test-generator.js",
12 | "asp": "asp --verbose --nologo",
13 | "asp:ci": "asp --nologo",
14 | "prettier": "prettier --check .",
15 | "prettier:write": "prettier --write .",
16 | "eslint:write": "npm run eslint -- --fix ",
17 | "asbuild:untouched": "asc assembly/index.ts --target debug",
18 | "asbuild:optimized": "asc assembly/index.ts --target release",
19 | "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized",
20 | "asbuild:empty": "asc --config asconfig.empty.json",
21 | "tsrun": "ts-node ts/index.ts",
22 | "benchmark": "node benchmark/benchmark.js",
23 | "eslint": "eslint --max-warnings 0 --ext ts \"assembly/**/*.ts\""
24 | },
25 | "author": "colin.eberhardt@gmail.com",
26 | "license": "MIT",
27 | "repository": {
28 | "type": "git",
29 | "url": "git+https://github.com/ColinEberhardt/assemblyscript-regex"
30 | },
31 | "devDependencies": {
32 | "@as-pect/cli": "^8.0.1",
33 | "@assemblyscript/loader": "^0.27.0",
34 | "@types/node": "^14.14.13",
35 | "@typescript-eslint/eslint-plugin": "^4.14.1",
36 | "@typescript-eslint/parser": "^4.14.1",
37 | "assemblyscript": "^0.25.0",
38 | "benchmark": "^2.1.4",
39 | "eslint": "^7.18.0",
40 | "husky": "^4.2.5",
41 | "prettier": "^2.2.1",
42 | "semantic-release": "^17.3.7",
43 | "text-encoding": "^0.7.0",
44 | "ts-node": "^9.1.1",
45 | "typescript": "^4.1.3"
46 | },
47 | "husky": {
48 | "hooks": {
49 | "pre-commit": "npm run prettier && npm run eslint"
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/spec/pcre-1.dat:
--------------------------------------------------------------------------------
1 | E the quick brown fox the quick brown fox (0,19)
2 | E SAME The quick brown FOX NOMATCH
3 | E SAME What do you know about the quick brown fox? (23,42)
4 | E SAME What do you know about THE QUICK BROWN FOX? NOMATCH
5 | Ei The quick brown fox the quick brown fox (0,19)
6 | Ei SAME The quick brown FOX (0,19)
7 | Ei SAME What do you know about the quick brown fox? (23,42)
8 | Ei SAME What do you know about THE QUICK BROWN FOX? (23,42)
9 | E$ abcd\\t\\n\\r\\f\\a\\e\\071\\x3b\\$\\\\\\?caxyz abcd\t\n\r\f\a\e9;$\\?caxyz (0,20)
10 | E a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz abxyzpqrrrabbxyyyypqAzz (0,23)
11 | E SAME abxyzpqrrrabbxyyyypqAzz (0,23)
12 | E SAME aabxyzpqrrrabbxyyyypqAzz (0,24)
13 | E SAME aaabxyzpqrrrabbxyyyypqAzz (0,25)
14 | E SAME aaaabxyzpqrrrabbxyyyypqAzz (0,26)
15 | E SAME abcxyzpqrrrabbxyyyypqAzz (0,24)
16 | E SAME aabcxyzpqrrrabbxyyyypqAzz (0,25)
17 | E SAME aaabcxyzpqrrrabbxyyyypAzz (0,25)
18 | E SAME aaabcxyzpqrrrabbxyyyypqAzz (0,26)
19 | E SAME aaabcxyzpqrrrabbxyyyypqqAzz (0,27)
20 | E SAME aaabcxyzpqrrrabbxyyyypqqqAzz (0,28)
21 | E SAME aaabcxyzpqrrrabbxyyyypqqqqAzz (0,29)
22 | E SAME aaabcxyzpqrrrabbxyyyypqqqqqAzz (0,30)
23 | E SAME aaabcxyzpqrrrabbxyyyypqqqqqqAzz (0,31)
24 | E SAME aaaabcxyzpqrrrabbxyyyypqAzz (0,27)
25 | E SAME abxyzzpqrrrabbxyyyypqAzz (0,24)
26 | E SAME aabxyzzzpqrrrabbxyyyypqAzz (0,26)
27 | E SAME aaabxyzzzzpqrrrabbxyyyypqAzz (0,28)
28 | E SAME aaaabxyzzzzpqrrrabbxyyyypqAzz (0,29)
29 | E SAME abcxyzzpqrrrabbxyyyypqAzz (0,25)
30 | E SAME aabcxyzzzpqrrrabbxyyyypqAzz (0,27)
31 | E SAME aaabcxyzzzzpqrrrabbxyyyypqAzz (0,29)
32 | E SAME aaaabcxyzzzzpqrrrabbxyyyypqAzz (0,30)
33 | E SAME aaaabcxyzzzzpqrrrabbbxyyyypqAzz (0,31)
34 | E SAME aaaabcxyzzzzpqrrrabbbxyyyyypqAzz (0,32)
35 | E SAME aaabcxyzpqrrrabbxyyyypABzz (0,26)
36 | E SAME aaabcxyzpqrrrabbxyyyypABBzz (0,27)
37 | E SAME >>>aaabxyzpqrrrabbxyyyypqAzz (3,28)
38 | E SAME >aaaabxyzpqrrrabbxyyyypqAzz (1,27)
39 | E SAME >>>>abcxyzpqrrrabbxyyyypqAzz (4,28)
40 | E SAME abxyzpqrrabbxyyyypqAzz NOMATCH
41 | E SAME abxyzpqrrrrabbxyyyypqAzz NOMATCH
42 | E SAME abxyzpqrrrabxyyyypqAzz NOMATCH
43 | E SAME aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz NOMATCH
44 | E SAME aaaabcxyzzzzpqrrrabbbxyyypqAzz NOMATCH
45 | E SAME aaabcxyzpqrrrabbxyyyypqqqqqqqAzz NOMATCH
46 | E ^(abc){1,2}zz abczz (0,5)(0,3)
47 | E SAME abcabczz (0,8)(3,6)
48 | E SAME zz NOMATCH
49 | E SAME abcabcabczz NOMATCH
50 | E SAME >>abczz NOMATCH
51 | E ^(b+?|a){1,2}?c bc (0,2)(0,1)
52 | E SAME bbc (0,3)(1,2)
53 | E SAME bbbc (0,4)(1,3)
54 | E SAME bac (0,3)(1,2)
55 | E SAME bbac (0,4)(2,3)
56 | E SAME aac (0,3)(1,2)
57 | E SAME abbbbbbbbbbbc (0,13)(1,12)
58 | E SAME bbbbbbbbbbbac (0,13)(11,12)
59 | E SAME aaac NOMATCH
60 | E SAME abbbbbbbbbbbac NOMATCH
61 | E ^(b+|a){1,2}c bc (0,2)(0,1)
62 | E SAME bbc (0,3)(0,2)
63 | E SAME bbbc (0,4)(0,3)
64 | E SAME bac (0,3)(1,2)
65 | E SAME bbac (0,4)(2,3)
66 | E SAME aac (0,3)(1,2)
67 | E SAME abbbbbbbbbbbc (0,13)(1,12)
68 | E SAME bbbbbbbbbbbac (0,13)(11,12)
69 | E SAME aaac NOMATCH
70 | E SAME abbbbbbbbbbbac NOMATCH
71 | E ^(b+|a){1,2}?bc bbc (0,3)(0,1)
72 | E ^(b*|ba){1,2}?bc babc (0,4)(0,2)
73 | E SAME bbabc (0,5)(1,3)
74 | E SAME bababc (0,6)(2,4)
75 | E SAME bababbc NOMATCH
76 | E SAME babababc NOMATCH
77 | E ^(ba|b*){1,2}?bc babc (0,4)(0,2)
78 | E SAME bbabc (0,5)(1,3)
79 | E SAME bababc (0,6)(2,4)
80 | E SAME bababbc NOMATCH
81 | E SAME babababc NOMATCH
82 | E$ ^\\ca\\cA\\c[\\c{\\c: \x01\x01\e;z (0,5)
83 | E$kv ^[ab\\]cde] athing (0,1)
84 | E$kv SAME bthing (0,1)
85 | E$kv SAME ]thing (0,1)
86 | E$kv SAME cthing (0,1)
87 | E$kv SAME dthing (0,1)
88 | E$kv SAME ething (0,1)
89 | E$kv SAME fthing NOMATCH
90 | E$kv SAME [thing NOMATCH
91 | E$kv SAME \\thing NOMATCH
92 | E ^[]cde] ]thing (0,1)
93 | E SAME cthing (0,1)
94 | E SAME dthing (0,1)
95 | E SAME ething (0,1)
96 | E SAME athing NOMATCH
97 | E SAME fthing NOMATCH
98 | E$kv ^[^ab\\]cde] fthing (0,1)
99 | E$kv SAME [thing (0,1)
100 | E$kv SAME \\thing (0,1)
101 | E$kv SAME athing NOMATCH
102 | E$kv SAME bthing NOMATCH
103 | E$kv SAME ]thing NOMATCH
104 | E$kv SAME cthing NOMATCH
105 | E$kv SAME dthing NOMATCH
106 | E$kv SAME ething NOMATCH
107 | E ^[^]cde] athing (0,1)
108 | E SAME fthing (0,1)
109 | E SAME ]thing NOMATCH
110 | E SAME cthing NOMATCH
111 | E SAME dthing NOMATCH
112 | E SAME ething NOMATCH
113 | E$x ^\\� � (0,1)
114 | E ^� � (0,1)
115 | E ^[0-9]+$ 0 (0,1)
116 | E SAME 1 (0,1)
117 | E SAME 2 (0,1)
118 | E SAME 3 (0,1)
119 | E SAME 4 (0,1)
120 | E SAME 5 (0,1)
121 | E SAME 6 (0,1)
122 | E SAME 7 (0,1)
123 | E SAME 8 (0,1)
124 | E SAME 9 (0,1)
125 | E SAME 10 (0,2)
126 | E SAME 100 (0,3)
127 | E SAME abc NOMATCH
128 | E ^.*nter enter (0,5)
129 | E SAME inter (0,5)
130 | E SAME uponter (0,7)
131 | E ^xxx[0-9]+$ xxx0 (0,4)
132 | E SAME xxx1234 (0,7)
133 | E SAME xxx NOMATCH
134 | E ^.+[0-9][0-9][0-9]$ x123 (0,4)
135 | E SAME xx123 (0,5)
136 | E SAME 123456 (0,6)
137 | E SAME 123 NOMATCH
138 | E SAME x1234 (0,5)
139 | E ^.+?[0-9][0-9][0-9]$ x123 (0,4)
140 | E SAME xx123 (0,5)
141 | E SAME 123456 (0,6)
142 | E SAME 123 NOMATCH
143 | E SAME x1234 (0,5)
144 | E$ ^([^!]+)!(.+)=apquxz\\.ixr\\.zzz\\.ac\\.uk$ abc!pqr=apquxz.ixr.zzz.ac.uk (0,28)(0,3)(4,7)
145 | E$ SAME !pqr=apquxz.ixr.zzz.ac.uk NOMATCH
146 | E$ SAME abc!=apquxz.ixr.zzz.ac.uk NOMATCH
147 | E$ SAME abc!pqr=apquxz:ixr.zzz.ac.uk NOMATCH
148 | E$ SAME abc!pqr=apquxz.ixr.zzz.ac.ukk NOMATCH
149 | E : Well, we need a colon: somewhere (21,22)
150 | E SAME *** Fail if we don't NOMATCH
151 | E$iv ([\\da-f:]+)$ 0abc (0,4)(0,4)
152 | E$iv SAME abc (0,3)(0,3)
153 | E$iv SAME fed (0,3)(0,3)
154 | E$iv SAME E (0,1)(0,1)
155 | E$iv SAME :: (0,2)(0,2)
156 | E$iv SAME 5f03:12C0::932e (0,15)(0,15)
157 | E$iv SAME fed def (4,7)(4,7)
158 | E$iv SAME Any old stuff (11,13)(11,13)
159 | E$iv SAME 0zzz NOMATCH
160 | E$iv SAME gzzz NOMATCH
161 | E$iv SAME fed\x20 NOMATCH
162 | E$iv SAME Any old rubbish NOMATCH
163 | E$ ^.*\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$ .1.2.3 (0,6)(1,2)(3,4)(5,6)
164 | E$ SAME A.12.123.0 (0,10)(2,4)(5,8)(9,10)
165 | E$ SAME .1.2.3333 NOMATCH
166 | E$ SAME 1.2.3 NOMATCH
167 | E$ SAME 1234.2.3 NOMATCH
168 | E$ ^(\\d+)\\s+IN\\s+SOA\\s+(\\S+)\\s+(\\S+)\\s*\\(\\s*$ 1 IN SOA non-sp1 non-sp2( (0,25)(0,1)(9,16)(17,24)
169 | E$ SAME 1 IN SOA non-sp1 non-sp2 ( (0,40)(0,1)(18,25)(29,36)
170 | E$ SAME 1IN SOA non-sp1 non-sp2( NOMATCH
171 | E$kv ^[a-zA-Z\\d][a-zA-Z\\d\\-]*(\\.[a-zA-Z\\d][a-zA-z\\d\\-]*)*\\.$ a. (0,2)
172 | E$kv SAME Z. (0,2)
173 | E$kv SAME 2. (0,2)
174 | E$kv SAME ab-c.pq-r. (0,10)(4,9)
175 | E$kv SAME sxk.zzz.ac.uk. (0,14)(10,13)
176 | E$kv SAME x-.y-. (0,6)(2,5)
177 | E$kv SAME -abc.peq. NOMATCH
178 | E$kv ^\\*\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?(\\.[a-z]([a-z\\-\\d]*[a-z\\d]+)?)*$ *.a (0,3)
179 | E$kv SAME *.b0-a (0,6)(3,6)
180 | E$kv SAME *.c3-b.c (0,8)(3,6)(6,8)
181 | E$kv SAME *.c-a.b-c (0,9)(3,5)(5,9)(7,9)
182 | E$kv SAME *.0 NOMATCH
183 | E$kv SAME *.a- NOMATCH
184 | E$kv SAME *.a-b.c- NOMATCH
185 | E$kv SAME *.c-a.0-c NOMATCH
186 | E ^(?=ab(de))(abd)(e) abde (0,4)(2,4)(0,3)(3,4)
187 | E ^(?!(ab)de|x)(abd)(f) abdf (0,4)(?,?)(0,3)(3,4)
188 | E ^(?=(ab(cd)))(ab) abcd (0,2)(0,4)(2,4)(0,2)
189 | E$iv ^[\\da-f](\\.[\\da-f])*$ a.b.c.d (0,7)(5,7)
190 | E$iv SAME A.B.C.D (0,7)(5,7)
191 | E$iv SAME a.b.c.1.2.3.C (0,13)(11,13)
192 | E$ ^".*"\\s*(;.*)?$ "1234" (0,6)
193 | E$ SAME "abcd" ; (0,8)(7,8)
194 | E$ SAME "" ; rhubarb (0,12)(3,12)
195 | E$ SAME "1234" : things NOMATCH
196 | E$ ^$ NULL (0,0)
197 | E$c ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end) ab c (0,4)
198 | E$c SAME abc NOMATCH
199 | E$c SAME ab cde NOMATCH
200 | E$ (?x) ^ a (?# begins with a) b\\sc (?# then b c) $ (?# then end) ab c (0,4)
201 | E$ SAME abc NOMATCH
202 | E$ SAME ab cde NOMATCH
203 | E$c ^ a\\ b[c ]d $ a bcd (0,5)
204 | E$c SAME a b d (0,5)
205 | E$c SAME abcd NOMATCH
206 | E$c SAME ab d NOMATCH
207 | E ^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$ abcdefhijklm (0,12)(0,3)(1,3)(2,3)(3,6)(4,6)(5,6)(6,9)(7,9)(8,9)(9,12)(10,12)(11,12)
208 | E ^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$ abcdefhijklm (0,12)(1,3)(2,3)(4,6)(5,6)(7,9)(8,9)(10,12)(11,12)
209 | E$v ^[\\w][\\W][\\s][\\S][\\d][\\D][\\f][\\n][\\c]][\\022] a+ Z0+\x0c\n\x1d\x12 (0,10)
210 | E$ ^[.^$|()*+?{,}]+ .^$(*+)|{?,?} (0,13)
211 | E$ ^a*\\w z (0,1)
212 | E$ SAME az (0,2)
213 | E$ SAME aaaz (0,4)
214 | E$ SAME a (0,1)
215 | E$ SAME aa (0,2)
216 | E$ SAME aaaa (0,4)
217 | E$ SAME a+ (0,1)
218 | E$ SAME aa+ (0,2)
219 | E$ ^a*?\\w z (0,1)
220 | E$ SAME az (0,1)
221 | E$ SAME aaaz (0,1)
222 | E$ SAME a (0,1)
223 | E$ SAME aa (0,1)
224 | E$ SAME aaaa (0,1)
225 | E$ SAME a+ (0,1)
226 | E$ SAME aa+ (0,1)
227 | E$ ^a+\\w az (0,2)
228 | E$ SAME aaaz (0,4)
229 | E$ SAME aa (0,2)
230 | E$ SAME aaaa (0,4)
231 | E$ SAME aa+ (0,2)
232 | E$ ^a+?\\w az (0,2)
233 | E$ SAME aaaz (0,2)
234 | E$ SAME aa (0,2)
235 | E$ SAME aaaa (0,2)
236 | E$ SAME aa+ (0,2)
237 | E$ ^\\d{8}\\w{2,} 1234567890 (0,10)
238 | E$ SAME 12345678ab (0,10)
239 | E$ SAME 12345678__ (0,10)
240 | E$ SAME 1234567 NOMATCH
241 | E$v ^[aeiou\\d]{4,5}$ uoie (0,4)
242 | E$v SAME 1234 (0,4)
243 | E$v SAME 12345 (0,5)
244 | E$v SAME aaaaa (0,5)
245 | E$v SAME 123456 NOMATCH
246 | E$v ^[aeiou\\d]{4,5}? uoie (0,4)
247 | E$v SAME 1234 (0,4)
248 | E$v SAME 12345 (0,4)
249 | E$v SAME aaaaa (0,4)
250 | E$v SAME 123456 (0,4)
251 | E$ \\A(abc|def)=(\\1){2,3}\\Z abc=abcabc (0,10)(0,3)(7,10)
252 | E$ SAME def=defdefdef (0,13)(0,3)(10,13)
253 | E$ SAME abc=defdef NOMATCH
254 | E$h ^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\\11*(\\3\\4)\\1(?#)2$ abcdefghijkcda2 (0,15)(0,1)(1,2)(2,3)(3,4)(4,5)(5,6)(6,7)(7,8)(8,9)(9,10)(10,11)(11,13)
255 | E$h SAME abcdefghijkkkkcda2 (0,18)(0,1)(1,2)(2,3)(3,4)(4,5)(5,6)(6,7)(7,8)(8,9)(9,10)(10,11)(14,16)
256 | E$ ^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(?11)*((?3)(?4))(?1)(?#)2$ abcdefghijkcda2 (0,15)(0,1)(1,2)(2,3)(3,4)(4,5)(5,6)(6,7)(7,8)(8,9)(9,10)(10,11)(11,13)
257 | E$ SAME abcdefghijkkkkcda2 (0,18)(0,1)(1,2)(2,3)(3,4)(4,5)(5,6)(6,7)(7,8)(8,9)(9,10)(10,11)(14,16)
258 | E$z (cat(a(ract|tonic)|erpillar)) \\1()2(3) cataract cataract23 (0,19)(0,8)(3,8)(4,8)(17,17)(18,19)
259 | E$z SAME catatonic catatonic23 (0,21)(0,9)(3,9)(4,9)(19,19)(20,21)
260 | E$z SAME caterpillar caterpillar23 (0,25)(0,11)(3,11)(?,?)(23,23)(24,25)
261 | E ^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,27)(5,9)
262 | E$ ^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,27)(15,19)
263 | E$ SAME From abcd Mon Sep 1 12:33:02 1997 (0,27)(15,20)
264 | E$ SAME From abcd Sep 01 12:33:02 1997 NOMATCH
265 | Ej$ ^12.34 12\n34 (0,5)
266 | Ej$ SAME 12\r34 (0,5)
267 | E$ \\w+(?=\\t) the quick brown\t fox (10,15)
268 | E foo(?!bar)(.*) foobar is foolish see? (10,22)(13,22)
269 | E (?:(?!foo)...|^.{0,2})bar(.*) foobar crowbar etc (8,18)(14,18)
270 | E SAME barrel (0,6)(3,6)
271 | E SAME 2barrel (0,7)(4,7)
272 | E SAME A barrel (0,8)(5,8)
273 | E$ ^(\\D*)(?=\\d)(?!123) abc456 (0,3)(0,3)
274 | E$ SAME abc123 NOMATCH
275 | E$ ^1234(?# test newlines\n\
276 | inside) 1234 (0,4)
277 | E$c ^1234 #comment in extended re\n\
278 | 1234 (0,4)
279 | E$c #rhubarb\n\
280 | abcd abcd (0,4)
281 | Ec ^abcd#rhubarb abcd (0,4)
282 | E$ ^(a)\\1{2,3}(.) aaab (0,4)(0,1)(3,4)
283 | E$ SAME aaaab (0,5)(0,1)(4,5)
284 | E$ SAME aaaaab (0,5)(0,1)(4,5)
285 | E$ SAME aaaaaab (0,5)(0,1)(4,5)
286 | E (?!^)abc the abc (4,7)
287 | E SAME abc NOMATCH
288 | E (?=^)abc abc (0,3)
289 | E SAME the abc NOMATCH
290 | E ^[ab]{1,3}(ab*|b) aabbbbb (0,7)(1,7)
291 | E ^[ab]{1,3}?(ab*|b) aabbbbb (0,7)(1,7)
292 | E ^[ab]{1,3}?(ab*?|b) aabbbbb (0,2)(1,2)
293 | E ^[ab]{1,3}(ab*?|b) aabbbbb (0,4)(3,4)
294 | E$ckv (?: [\\040\\t] | \\(\n\
295 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
296 | \\) )* # optional leading comment\n\
297 | (?: (?:\n\
298 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
299 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
300 | |\n\
301 | " (?: # opening quote...\n\
302 | [^\\\\\\x80-\\xff\\n\\015"] # Anything except backslash and quote\n\
303 | | # or\n\
304 | \\\\ [^\\x80-\\xff] # Escaped something (something != CR)\n\
305 | )* " # closing quote\n\
306 | ) # initial word\n\
307 | (?: (?: [\\040\\t] | \\(\n\
308 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
309 | \\) )* \\. (?: [\\040\\t] | \\(\n\
310 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
311 | \\) )* (?:\n\
312 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
313 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
314 | |\n\
315 | " (?: # opening quote...\n\
316 | [^\\\\\\x80-\\xff\\n\\015"] # Anything except backslash and quote\n\
317 | | # or\n\
318 | \\\\ [^\\x80-\\xff] # Escaped something (something != CR)\n\
319 | )* " # closing quote\n\
320 | ) )* # further okay, if led by a period\n\
321 | (?: [\\040\\t] | \\(\n\
322 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
323 | \\) )* @ (?: [\\040\\t] | \\(\n\
324 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
325 | \\) )* (?:\n\
326 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
327 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
328 | | \\[ # [\n\
329 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
330 | \\] # ]\n\
331 | ) # initial subdomain\n\
332 | (?: #\n\
333 | (?: [\\040\\t] | \\(\n\
334 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
335 | \\) )* \\. # if led by a period...\n\
336 | (?: [\\040\\t] | \\(\n\
337 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
338 | \\) )* (?:\n\
339 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
340 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
341 | | \\[ # [\n\
342 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
343 | \\] # ]\n\
344 | ) # ...further okay\n\
345 | )*\n\
346 | # address\n\
347 | | # or\n\
348 | (?:\n\
349 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
350 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
351 | |\n\
352 | " (?: # opening quote...\n\
353 | [^\\\\\\x80-\\xff\\n\\015"] # Anything except backslash and quote\n\
354 | | # or\n\
355 | \\\\ [^\\x80-\\xff] # Escaped something (something != CR)\n\
356 | )* " # closing quote\n\
357 | ) # one word, optionally followed by....\n\
358 | (?:\n\
359 | [^()<>@,;:".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] | # atom and space parts, or...\n\
360 | \\(\n\
361 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
362 | \\) | # comments, or...\n\
363 | \n\
364 | " (?: # opening quote...\n\
365 | [^\\\\\\x80-\\xff\\n\\015"] # Anything except backslash and quote\n\
366 | | # or\n\
367 | \\\\ [^\\x80-\\xff] # Escaped something (something != CR)\n\
368 | )* " # closing quote\n\
369 | # quoted strings\n\
370 | )*\n\
371 | < (?: [\\040\\t] | \\(\n\
372 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
373 | \\) )* # leading <\n\
374 | (?: @ (?: [\\040\\t] | \\(\n\
375 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
376 | \\) )* (?:\n\
377 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
378 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
379 | | \\[ # [\n\
380 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
381 | \\] # ]\n\
382 | ) # initial subdomain\n\
383 | (?: #\n\
384 | (?: [\\040\\t] | \\(\n\
385 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
386 | \\) )* \\. # if led by a period...\n\
387 | (?: [\\040\\t] | \\(\n\
388 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
389 | \\) )* (?:\n\
390 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
391 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
392 | | \\[ # [\n\
393 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
394 | \\] # ]\n\
395 | ) # ...further okay\n\
396 | )*\n\
397 | \n\
398 | (?: (?: [\\040\\t] | \\(\n\
399 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
400 | \\) )* , (?: [\\040\\t] | \\(\n\
401 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
402 | \\) )* @ (?: [\\040\\t] | \\(\n\
403 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
404 | \\) )* (?:\n\
405 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
406 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
407 | | \\[ # [\n\
408 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
409 | \\] # ]\n\
410 | ) # initial subdomain\n\
411 | (?: #\n\
412 | (?: [\\040\\t] | \\(\n\
413 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
414 | \\) )* \\. # if led by a period...\n\
415 | (?: [\\040\\t] | \\(\n\
416 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
417 | \\) )* (?:\n\
418 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
419 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
420 | | \\[ # [\n\
421 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
422 | \\] # ]\n\
423 | ) # ...further okay\n\
424 | )*\n\
425 | )* # further okay, if led by comma\n\
426 | : # closing colon\n\
427 | (?: [\\040\\t] | \\(\n\
428 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
429 | \\) )* )? # optional route\n\
430 | (?:\n\
431 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
432 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
433 | |\n\
434 | " (?: # opening quote...\n\
435 | [^\\\\\\x80-\\xff\\n\\015"] # Anything except backslash and quote\n\
436 | | # or\n\
437 | \\\\ [^\\x80-\\xff] # Escaped something (something != CR)\n\
438 | )* " # closing quote\n\
439 | ) # initial word\n\
440 | (?: (?: [\\040\\t] | \\(\n\
441 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
442 | \\) )* \\. (?: [\\040\\t] | \\(\n\
443 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
444 | \\) )* (?:\n\
445 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
446 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
447 | |\n\
448 | " (?: # opening quote...\n\
449 | [^\\\\\\x80-\\xff\\n\\015"] # Anything except backslash and quote\n\
450 | | # or\n\
451 | \\\\ [^\\x80-\\xff] # Escaped something (something != CR)\n\
452 | )* " # closing quote\n\
453 | ) )* # further okay, if led by a period\n\
454 | (?: [\\040\\t] | \\(\n\
455 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
456 | \\) )* @ (?: [\\040\\t] | \\(\n\
457 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
458 | \\) )* (?:\n\
459 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
460 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
461 | | \\[ # [\n\
462 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
463 | \\] # ]\n\
464 | ) # initial subdomain\n\
465 | (?: #\n\
466 | (?: [\\040\\t] | \\(\n\
467 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
468 | \\) )* \\. # if led by a period...\n\
469 | (?: [\\040\\t] | \\(\n\
470 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
471 | \\) )* (?:\n\
472 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
473 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
474 | | \\[ # [\n\
475 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
476 | \\] # ]\n\
477 | ) # ...further okay\n\
478 | )*\n\
479 | # address spec\n\
480 | (?: [\\040\\t] | \\(\n\
481 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
482 | \\) )* > # trailing >\n\
483 | # name and address\n\
484 | ) (?: [\\040\\t] | \\(\n\^[ab]{1,3}(ab*?|b)
485 | (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] | \\( (?: [^\\\\\\x80-\\xff\\n\\015()] | \\\\ [^\\x80-\\xff] )* \\) )*\n\
486 | \\) )* # optional trailing comment\n\
487 | Alan Other (0,25)
488 | E$ckv SAME (1,13)
489 | E$ckv SAME user@dom.ain (0,12)
490 | E$ckv SAME "A. Other" (a comment) (0,42)
491 | E$ckv SAME A. Other (a comment) (2,40)
492 | E$ckv SAME "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay (0,61)
493 | E$ckv SAME A missing angle @,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
514 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
515 | # Atom\n\
516 | | # or\n\
517 | " # "\n\
518 | [^\\\\\\x80-\\xff\\n\\015"] * # normal\n\
519 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015"] * )* # ( special normal* )*\n\
520 | " # "\n\
521 | # Quoted string\n\
522 | )\n\
523 | [\\040\\t]* # Nab whitespace.\n\
524 | (?:\n\
525 | \\( # (\n\
526 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
527 | (?: # (\n\
528 | (?: \\\\ [^\\x80-\\xff] |\n\
529 | \\( # (\n\
530 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
531 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
532 | \\) # )\n\
533 | ) # special\n\
534 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
535 | )* # )*\n\
536 | \\) # )\n\
537 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
538 | (?:\n\
539 | \\.\n\
540 | [\\040\\t]* # Nab whitespace.\n\
541 | (?:\n\
542 | \\( # (\n\
543 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
544 | (?: # (\n\
545 | (?: \\\\ [^\\x80-\\xff] |\n\
546 | \\( # (\n\
547 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
548 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
549 | \\) # )\n\
550 | ) # special\n\
551 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
552 | )* # )*\n\
553 | \\) # )\n\
554 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
555 | (?:\n\
556 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
557 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
558 | # Atom\n\
559 | | # or\n\
560 | " # "\n\
561 | [^\\\\\\x80-\\xff\\n\\015"] * # normal\n\
562 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015"] * )* # ( special normal* )*\n\
563 | " # "\n\
564 | # Quoted string\n\
565 | )\n\
566 | [\\040\\t]* # Nab whitespace.\n\
567 | (?:\n\
568 | \\( # (\n\
569 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
570 | (?: # (\n\
571 | (?: \\\\ [^\\x80-\\xff] |\n\
572 | \\( # (\n\
573 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
574 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
575 | \\) # )\n\
576 | ) # special\n\
577 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
578 | )* # )*\n\
579 | \\) # )\n\
580 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
581 | # additional words\n\
582 | )*\n\
583 | @\n\
584 | [\\040\\t]* # Nab whitespace.\n\
585 | (?:\n\
586 | \\( # (\n\
587 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
588 | (?: # (\n\
589 | (?: \\\\ [^\\x80-\\xff] |\n\
590 | \\( # (\n\
591 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
592 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
593 | \\) # )\n\
594 | ) # special\n\
595 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
596 | )* # )*\n\
597 | \\) # )\n\
598 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
599 | (?:\n\
600 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
601 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
602 | |\n\
603 | \\[ # [\n\
604 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
605 | \\] # ]\n\
606 | )\n\
607 | [\\040\\t]* # Nab whitespace.\n\
608 | (?:\n\
609 | \\( # (\n\
610 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
611 | (?: # (\n\
612 | (?: \\\\ [^\\x80-\\xff] |\n\
613 | \\( # (\n\
614 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
615 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
616 | \\) # )\n\
617 | ) # special\n\
618 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
619 | )* # )*\n\
620 | \\) # )\n\
621 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
622 | # optional trailing comments\n\
623 | (?:\n\
624 | \\.\n\
625 | [\\040\\t]* # Nab whitespace.\n\
626 | (?:\n\
627 | \\( # (\n\
628 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
629 | (?: # (\n\
630 | (?: \\\\ [^\\x80-\\xff] |\n\
631 | \\( # (\n\
632 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
633 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
634 | \\) # )\n\
635 | ) # special\n\
636 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
637 | )* # )*\n\
638 | \\) # )\n\
639 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
640 | (?:\n\
641 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
642 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
643 | |\n\
644 | \\[ # [\n\
645 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
646 | \\] # ]\n\
647 | )\n\
648 | [\\040\\t]* # Nab whitespace.\n\
649 | (?:\n\
650 | \\( # (\n\
651 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
652 | (?: # (\n\
653 | (?: \\\\ [^\\x80-\\xff] |\n\
654 | \\( # (\n\
655 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
656 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
657 | \\) # )\n\
658 | ) # special\n\
659 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
660 | )* # )*\n\
661 | \\) # )\n\
662 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
663 | # optional trailing comments\n\
664 | )*\n\
665 | # address\n\
666 | | # or\n\
667 | (?:\n\
668 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
669 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
670 | # Atom\n\
671 | | # or\n\
672 | " # "\n\
673 | [^\\\\\\x80-\\xff\\n\\015"] * # normal\n\
674 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015"] * )* # ( special normal* )*\n\
675 | " # "\n\
676 | # Quoted string\n\
677 | )\n\
678 | # leading word\n\
679 | [^()<>@,;:".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # "normal" atoms and or spaces\n\
680 | (?:\n\
681 | (?:\n\
682 | \\( # (\n\
683 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
684 | (?: # (\n\
685 | (?: \\\\ [^\\x80-\\xff] |\n\
686 | \\( # (\n\
687 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
688 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
689 | \\) # )\n\
690 | ) # special\n\
691 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
692 | )* # )*\n\
693 | \\) # )\n\
694 | |\n\
695 | " # "\n\
696 | [^\\\\\\x80-\\xff\\n\\015"] * # normal\n\
697 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015"] * )* # ( special normal* )*\n\
698 | " # "\n\
699 | ) # "special" comment or quoted string\n\
700 | [^()<>@,;:".\\\\\\[\\]\\x80-\\xff\\000-\\010\\012-\\037] * # more "normal"\n\
701 | )*\n\
702 | <\n\
703 | [\\040\\t]* # Nab whitespace.\n\
704 | (?:\n\
705 | \\( # (\n\
706 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
707 | (?: # (\n\
708 | (?: \\\\ [^\\x80-\\xff] |\n\
709 | \\( # (\n\
710 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
711 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
712 | \\) # )\n\
713 | ) # special\n\
714 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
715 | )* # )*\n\
716 | \\) # )\n\
717 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
718 | # <\n\
719 | (?:\n\
720 | @\n\
721 | [\\040\\t]* # Nab whitespace.\n\
722 | (?:\n\
723 | \\( # (\n\
724 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
725 | (?: # (\n\
726 | (?: \\\\ [^\\x80-\\xff] |\n\
727 | \\( # (\n\
728 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
729 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
730 | \\) # )\n\
731 | ) # special\n\
732 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
733 | )* # )*\n\
734 | \\) # )\n\
735 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
736 | (?:\n\
737 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
738 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
739 | |\n\
740 | \\[ # [\n\
741 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
742 | \\] # ]\n\
743 | )\n\
744 | [\\040\\t]* # Nab whitespace.\n\
745 | (?:\n\
746 | \\( # (\n\
747 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
748 | (?: # (\n\
749 | (?: \\\\ [^\\x80-\\xff] |\n\
750 | \\( # (\n\
751 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
752 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
753 | \\) # )\n\
754 | ) # special\n\
755 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
756 | )* # )*\n\
757 | \\) # )\n\
758 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
759 | # optional trailing comments\n\
760 | (?:\n\
761 | \\.\n\
762 | [\\040\\t]* # Nab whitespace.\n\
763 | (?:\n\
764 | \\( # (\n\
765 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
766 | (?: # (\n\
767 | (?: \\\\ [^\\x80-\\xff] |\n\
768 | \\( # (\n\
769 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
770 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
771 | \\) # )\n\
772 | ) # special\n\
773 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
774 | )* # )*\n\
775 | \\) # )\n\
776 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
777 | (?:\n\
778 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
779 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
780 | |\n\
781 | \\[ # [\n\
782 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
783 | \\] # ]\n\
784 | )\n\
785 | [\\040\\t]* # Nab whitespace.\n\
786 | (?:\n\
787 | \\( # (\n\
788 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
789 | (?: # (\n\
790 | (?: \\\\ [^\\x80-\\xff] |\n\
791 | \\( # (\n\
792 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
793 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
794 | \\) # )\n\
795 | ) # special\n\
796 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
797 | )* # )*\n\
798 | \\) # )\n\
799 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
800 | # optional trailing comments\n\
801 | )*\n\
802 | (?: ,\n\
803 | [\\040\\t]* # Nab whitespace.\n\
804 | (?:\n\
805 | \\( # (\n\
806 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
807 | (?: # (\n\
808 | (?: \\\\ [^\\x80-\\xff] |\n\
809 | \\( # (\n\
810 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
811 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
812 | \\) # )\n\
813 | ) # special\n\
814 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
815 | )* # )*\n\
816 | \\) # )\n\
817 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
818 | @\n\
819 | [\\040\\t]* # Nab whitespace.\n\
820 | (?:\n\
821 | \\( # (\n\
822 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
823 | (?: # (\n\
824 | (?: \\\\ [^\\x80-\\xff] |\n\
825 | \\( # (\n\
826 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
827 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
828 | \\) # )\n\
829 | ) # special\n\
830 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
831 | )* # )*\n\
832 | \\) # )\n\
833 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
834 | (?:\n\
835 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
836 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
837 | |\n\
838 | \\[ # [\n\
839 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
840 | \\] # ]\n\
841 | )\n\
842 | [\\040\\t]* # Nab whitespace.\n\
843 | (?:\n\
844 | \\( # (\n\
845 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
846 | (?: # (\n\
847 | (?: \\\\ [^\\x80-\\xff] |\n\
848 | \\( # (\n\
849 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
850 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
851 | \\) # )\n\
852 | ) # special\n\
853 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
854 | )* # )*\n\
855 | \\) # )\n\
856 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
857 | # optional trailing comments\n\
858 | (?:\n\
859 | \\.\n\
860 | [\\040\\t]* # Nab whitespace.\n\
861 | (?:\n\
862 | \\( # (\n\
863 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
864 | (?: # (\n\
865 | (?: \\\\ [^\\x80-\\xff] |\n\
866 | \\( # (\n\
867 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
868 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
869 | \\) # )\n\
870 | ) # special\n\
871 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
872 | )* # )*\n\
873 | \\) # )\n\
874 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
875 | (?:\n\
876 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
877 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
878 | |\n\
879 | \\[ # [\n\
880 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
881 | \\] # ]\n\
882 | )\n\
883 | [\\040\\t]* # Nab whitespace.\n\
884 | (?:\n\
885 | \\( # (\n\
886 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
887 | (?: # (\n\
888 | (?: \\\\ [^\\x80-\\xff] |\n\
889 | \\( # (\n\
890 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
891 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
892 | \\) # )\n\
893 | ) # special\n\
894 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
895 | )* # )*\n\
896 | \\) # )\n\
897 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
898 | # optional trailing comments\n\
899 | )*\n\
900 | )* # additional domains\n\
901 | :\n\
902 | [\\040\\t]* # Nab whitespace.\n\
903 | (?:\n\
904 | \\( # (\n\
905 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
906 | (?: # (\n\
907 | (?: \\\\ [^\\x80-\\xff] |\n\
908 | \\( # (\n\
909 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
910 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
911 | \\) # )\n\
912 | ) # special\n\
913 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
914 | )* # )*\n\
915 | \\) # )\n\
916 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
917 | # optional trailing comments\n\
918 | )? # optional route\n\
919 | (?:\n\
920 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
921 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
922 | # Atom\n\
923 | | # or\n\
924 | " # "\n\
925 | [^\\\\\\x80-\\xff\\n\\015"] * # normal\n\
926 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015"] * )* # ( special normal* )*\n\
927 | " # "\n\
928 | # Quoted string\n\
929 | )\n\
930 | [\\040\\t]* # Nab whitespace.\n\
931 | (?:\n\
932 | \\( # (\n\
933 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
934 | (?: # (\n\
935 | (?: \\\\ [^\\x80-\\xff] |\n\
936 | \\( # (\n\
937 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
938 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
939 | \\) # )\n\
940 | ) # special\n\
941 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
942 | )* # )*\n\
943 | \\) # )\n\
944 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
945 | (?:\n\
946 | \\.\n\
947 | [\\040\\t]* # Nab whitespace.\n\
948 | (?:\n\
949 | \\( # (\n\
950 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
951 | (?: # (\n\
952 | (?: \\\\ [^\\x80-\\xff] |\n\
953 | \\( # (\n\
954 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
955 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
956 | \\) # )\n\
957 | ) # special\n\
958 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
959 | )* # )*\n\
960 | \\) # )\n\
961 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
962 | (?:\n\
963 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
964 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
965 | # Atom\n\
966 | | # or\n\
967 | " # "\n\
968 | [^\\\\\\x80-\\xff\\n\\015"] * # normal\n\
969 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015"] * )* # ( special normal* )*\n\
970 | " # "\n\
971 | # Quoted string\n\
972 | )\n\
973 | [\\040\\t]* # Nab whitespace.\n\
974 | (?:\n\
975 | \\( # (\n\
976 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
977 | (?: # (\n\
978 | (?: \\\\ [^\\x80-\\xff] |\n\
979 | \\( # (\n\
980 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
981 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
982 | \\) # )\n\
983 | ) # special\n\
984 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
985 | )* # )*\n\
986 | \\) # )\n\
987 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
988 | # additional words\n\
989 | )*\n\
990 | @\n\
991 | [\\040\\t]* # Nab whitespace.\n\
992 | (?:\n\
993 | \\( # (\n\
994 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
995 | (?: # (\n\
996 | (?: \\\\ [^\\x80-\\xff] |\n\
997 | \\( # (\n\
998 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
999 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
1000 | \\) # )\n\
1001 | ) # special\n\
1002 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1003 | )* # )*\n\
1004 | \\) # )\n\
1005 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
1006 | (?:\n\
1007 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
1008 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
1009 | |\n\
1010 | \\[ # [\n\
1011 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
1012 | \\] # ]\n\
1013 | )\n\
1014 | [\\040\\t]* # Nab whitespace.\n\
1015 | (?:\n\
1016 | \\( # (\n\
1017 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1018 | (?: # (\n\
1019 | (?: \\\\ [^\\x80-\\xff] |\n\
1020 | \\( # (\n\
1021 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1022 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
1023 | \\) # )\n\
1024 | ) # special\n\
1025 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1026 | )* # )*\n\
1027 | \\) # )\n\
1028 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
1029 | # optional trailing comments\n\
1030 | (?:\n\
1031 | \\.\n\
1032 | [\\040\\t]* # Nab whitespace.\n\
1033 | (?:\n\
1034 | \\( # (\n\
1035 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1036 | (?: # (\n\
1037 | (?: \\\\ [^\\x80-\\xff] |\n\
1038 | \\( # (\n\
1039 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1040 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
1041 | \\) # )\n\
1042 | ) # special\n\
1043 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1044 | )* # )*\n\
1045 | \\) # )\n\
1046 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
1047 | (?:\n\
1048 | [^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]+ # some number of atom characters...\n\
1049 | (?![^(\\040)<>@,;:".\\\\\\[\\]\\000-\\037\\x80-\\xff]) # ..not followed by something that could be part of an atom\n\
1050 | |\n\
1051 | \\[ # [\n\
1052 | (?: [^\\\\\\x80-\\xff\\n\\015\\[\\]] | \\\\ [^\\x80-\\xff] )* # stuff\n\
1053 | \\] # ]\n\
1054 | )\n\
1055 | [\\040\\t]* # Nab whitespace.\n\
1056 | (?:\n\
1057 | \\( # (\n\
1058 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1059 | (?: # (\n\
1060 | (?: \\\\ [^\\x80-\\xff] |\n\
1061 | \\( # (\n\
1062 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1063 | (?: \\\\ [^\\x80-\\xff] [^\\\\\\x80-\\xff\\n\\015()] * )* # (special normal*)*\n\
1064 | \\) # )\n\
1065 | ) # special\n\
1066 | [^\\\\\\x80-\\xff\\n\\015()] * # normal*\n\
1067 | )* # )*\n\
1068 | \\) # )\n\
1069 | [\\040\\t]* )* # If comment found, allow more spaces.\n\
1070 | # optional trailing comments\n\
1071 | )*\n\
1072 | # address spec\n\
1073 | > # >\n\
1074 | # name and address\n\
1075 | )\n\
1076 | Alan Other (0,25)
1077 | E$ckv SAME (1,13)
1078 | E$ckv SAME user@dom.ain (0,12)
1079 | E$ckv SAME "A. Other" (a comment) (0,30)
1080 | E$ckv SAME A. Other (a comment) (2,28)
1081 | E$ckv SAME "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay (0,61)
1082 | E$ckv SAME A missing angle ]{0,})>]{0,})>([\\d]{0,}\\.)(.*)(( ([\\w\\W\\s\\d][^<>]{0,})|[\\s]{0,})) | ]{0,})>([\\w\\W\\s\\d][^<>]{0,}) | ]{0,})>([\\w\\W\\s\\d][^<>]{0,}) | |