1 line
92 KiB
HTML
1 line
92 KiB
HTML
<!doctype html><title>Introduction to RegEx</title><meta charset=utf-8><meta content="width=device-width,initial-scale=1" name=viewport><link href=res/favicon.png rel=icon sizes=512x512><link href=res/favicon.png rel=image_src type=image/png><link title="alexs168's blog" href=atom.xml rel=alternate type=application/atom+xml><body><style>@font-face{font-family:DejaVu Sans Mono;src:local(DejaVu Sans Mono),url(res/DejaVuSansMono.woff2)format("woff2"),local(Courier New),local(Courier),local(monospace);font-weight:400;font-style:normal;font-display:swap}body{font-family:DejaVu Sans Mono;font-size:10pt}td{vertical-align:top;width:100%;display:inline}h1,h2,h3,h4{margin-top:1%;margin-bottom:.75%}p{margin-top:.75%;margin-bottom:.75%}ul{margin-top:0%}.current{font-weight:700}pre{margin-top:0;margin-bottom:0;display:inline}a,a:visited{color:#3f51b5;text-decoration:none}</style><div><p><br><h1>Making a simple RegEx engine: Part 1: Introduction to RegEx</h1><p><span style=font-size:9pt><p>Git revision <a href=https://github.com/alex-s168/website/tree/fee2a36453b624f2e6ede5186b5f3e59aa3e6cc7>#fee2a364</a><p><br>Modified at 26. July 2025 14:20<p>Written by <a href=https://alex.vxcc.dev>alex_s168</a></span></div><div><p><br><span style=text-decoration:underline><h2>Introduction</h2></span> If you are any kind of programmer, you’ve probably heard of <a href=https://en.wikipedia.org/wiki/Regular_expression>RegEx</a><p>RegEx (Regular expression) is kind of like a small programming language used to define string search and replace patterns.<p><br>RegEx might seem overwhelming at first, but you can learn the most important features of RegEx very quickly.<p><br>It is important to mention that there is not a single standard for RegEx syntax, but instead each “implementation” has it’s own quirks, and additional features. Most common features however behave identically on most RegEx “engines”/implementations.</div><div><p><br><span style=text-decoration:underline><h2>Syntax</h2></span> The behavior of RegEx expressions / patterns depends on the match options passed to the RegEx engine.<p>Common match options<span id=match-options>:</span><ul><li>Anchored at start and end of line<li>Case insensitive<li>multi-line or instead whole string</ul></div><div><br><span style=text-decoration:underline><h3>“Atoms”</h3></span> In this article, we will refer to single expression parts as “atoms”.</div><div><br><span style=text-decoration:underline><h4>Characters</h4></span> Just use the character that you want to match. For example <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span> to match an <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>. This however does not work for all characters, because many are part of special RegEx syntax.</div><div><p><br><span id=escaped-chars style=text-decoration:underline><h4>Escaped Characters</h4></span> Thee previously mentioned special characters like <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>[</code></span> can be matched by putting a backslash in front of them: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#1d6c76>\[</span></code></span></p><svg viewbox="0 0 212.65625 69.75390625" class=typst-frame height=69.75390625pt style=width:21.2656em;height:6.97539em;overflow:visible width=212.65625pt xmlns=http://www.w3.org/2000/svg xmlns:h5=http://www.w3.org/1999/xhtml xmlns:xlink=http://www.w3.org/1999/xlink><g><g transform="translate(0 0)"><g class=typst-group><g><g transform="translate(0 -0.5)"><path d="M 0 0 L 0 70.75391" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(52.1435546875 -0.5)"><path d="M 0 0 L 0 70.75391" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(212.65625 -0.5)"><path d="M 0 0 L 0 70.75391" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 0)"><path d="M 0 0 L 213.65625 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 17.59765625)"><path d="M 0 0 L 213.65625 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 43.67578125)"><path d="M 0 0 L 213.65625 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 69.75390625)"><path d="M 0 0 L 213.65625 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gA9630BC7DC7C1A3B2772AC4EAF5E6A4E y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gF2D21C82F46AFB157CA5E1AB14665E2F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /></g></g><g transform="translate(0 17.59765625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#1d6c76 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#1d6c76 fill-rule=nonzero x=4.81640625 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gB83FD8DF61FB2E4EAD552878F3E8DD3F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=78.2666015625 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=96.328125 xlink:href=#g77AA3201A93C8F4113E19CCDA185B6F5 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=114.3896484375 xlink:href=#g958F64BF87063D7EAFEDE953DDA2BF9F y=0 /><use fill=#000000 fill-rule=nonzero x=120.41015625 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=132.451171875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=144.4921875 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /></g></g></g></g></g><g transform="translate(0 43.67578125)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#1d6c76 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#1d6c76 fill-rule=nonzero x=4.81640625 xlink:href=#g1E73FB87418835A88E58B2B7006EB72B y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gB83FD8DF61FB2E4EAD552878F3E8DD3F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g3D5EE249F6894FA38DD21E85E2FD5F05 y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#gD77243764E4306BD6D683907293F12D5 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=78.2666015625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /></g></g></g></g></g></g></g></g></g><defs id=glyph><symbol id=gA9630BC7DC7C1A3B2772AC4EAF5E6A4E overflow=visible><path d="M 1.9482422 6.479492 L 1.9482422 3.7402344 L 3.0908203 3.7402344 Q 3.774414 3.7402344 4.157715 4.1015625 Q 4.5410156 4.4628906 4.5410156 5.1123047 Q 4.5410156 5.7617188 4.1601563 6.1206055 Q 3.7792969 6.479492 3.0908203 6.479492 L 1.9482422 6.479492 Z M 0.96191406 7.290039 L 3.0908203 7.290039 Q 4.3115234 7.290039 4.9414063 6.73584 Q 5.571289 6.1816406 5.571289 5.1123047 Q 5.571289 4.033203 4.9438477 3.4814453 Q 4.3164063 2.9296875 3.0908203 2.9296875 L 1.9482422 2.9296875 L 1.9482422 0 L 0.96191406 0 L 0.96191406 7.290039 Z"/></symbol><symbol id=g37BF1C0F714F2658F35D194C9E053C6F overflow=visible><path d="M 3.4277344 2.7490234 L 3.1298828 2.7490234 Q 2.34375 2.7490234 1.9458008 2.4731445 Q 1.5478516 2.1972656 1.5478516 1.6503906 Q 1.5478516 1.1572266 1.8457031 0.88378906 Q 2.1435547 0.61035156 2.6708984 0.61035156 Q 3.413086 0.61035156 3.8378906 1.1254883 Q 4.2626953 1.640625 4.267578 2.5488281 L 4.267578 2.7490234 L 3.4277344 2.7490234 Z M 5.1708984 3.1201172 L 5.1708984 0 L 4.267578 0 L 4.267578 0.8105469 Q 3.9794922 0.32226563 3.5424805 0.09033203 Q 3.1054688 -0.14160156 2.4804688 -0.14160156 Q 1.6455078 -0.14160156 1.1474609 0.32958984 Q 0.64941406 0.80078125 0.64941406 1.5917969 Q 0.64941406 2.5048828 1.262207 2.9785156 Q 1.875 3.4521484 3.0615234 3.4521484 L 4.267578 3.4521484 L 4.267578 3.59375 Q 4.2626953 4.248047 3.9355469 4.543457 Q 3.6083984 4.838867 2.890625 4.838867 Q 2.4316406 4.838867 1.9628906 4.7070313 Q 1.4941406 4.5751953 1.0498047 4.321289 L 1.0498047 5.2197266 Q 1.5478516 5.4101563 2.0043945 5.505371 Q 2.4609375 5.600586 2.890625 5.600586 Q 3.569336 5.600586 4.050293 5.4003906 Q 4.53125 5.2001953 4.8291016 4.7998047 Q 5.0146484 4.555664 5.0927734 4.1967773 Q 5.1708984 3.8378906 5.1708984 3.1201172 Z"/></symbol><symbol id=g8EFE1C4A2E0CD0A03B7633D0C324134A overflow=visible><path d="M 2.9980469 7.0214844 L 2.9980469 5.46875 L 5.0390625 5.46875 L 5.0390625 4.770508 L 2.9980469 4.770508 L 2.9980469 1.8017578 Q 2.9980469 1.1962891 3.227539 0.95703125 Q 3.4570313 0.71777344 4.0283203 0.71777344 L 5.0390625 0.71777344 L 5.0390625 0 L 3.9404297 0 Q 2.9296875 0 2.5146484 0.40527344 Q 2.0996094 0.8105469 2.0996094 1.8017578 L 2.0996094 4.770508 L 0.63964844 4.770508 L 0.63964844 5.46875 L 2.0996094 5.46875 L 2.0996094 7.0214844 L 2.9980469 7.0214844 Z"/></symbol><symbol id=g9CEA08D585A10BDF30AE748A6F2738E3 overflow=visible><path d="M 5.4296875 2.9589844 L 5.4296875 2.5195313 L 1.5380859 2.5195313 L 1.5380859 2.4902344 Q 1.5380859 1.5966797 2.0043945 1.1083984 Q 2.4707031 0.6201172 3.3203125 0.6201172 Q 3.75 0.6201172 4.21875 0.75683594 Q 4.6875 0.8935547 5.2197266 1.171875 L 5.2197266 0.2783203 Q 4.7070313 0.068359375 4.230957 -0.036621094 Q 3.7548828 -0.14160156 3.3105469 -0.14160156 Q 2.0361328 -0.14160156 1.3183594 0.6225586 Q 0.60058594 1.3867188 0.60058594 2.7294922 Q 0.60058594 4.038086 1.3037109 4.819336 Q 2.006836 5.600586 3.178711 5.600586 Q 4.223633 5.600586 4.82666 4.892578 Q 5.4296875 4.1845703 5.4296875 2.9589844 Z M 4.53125 3.2226563 Q 4.5117188 4.013672 4.157715 4.4262695 Q 3.803711 4.838867 3.1396484 4.838867 Q 2.4902344 4.838867 2.0703125 4.4091797 Q 1.6503906 3.9794922 1.5722656 3.2177734 L 4.53125 3.2226563 Z"/></symbol><symbol id=g8B1CFD5A71F51FD444694A31ACE7ED10 overflow=visible><path d="M 5.6396484 4.3408203 Q 5.3515625 4.5654297 5.053711 4.6679688 Q 4.7558594 4.770508 4.399414 4.770508 Q 3.5595703 4.770508 3.1152344 4.243164 Q 2.6708984 3.7158203 2.6708984 2.7197266 L 2.6708984 0 L 1.7675781 0 L 1.7675781 5.46875 L 2.6708984 5.46875 L 2.6708984 4.399414 Q 2.8955078 4.9804688 3.3618164 5.2905273 Q 3.828125 5.600586 4.4677734 5.600586 Q 4.7998047 5.600586 5.0878906 5.517578 Q 5.3759766 5.4345703 5.6396484 5.258789 L 5.6396484 4.3408203 Z"/></symbol><symbol id=gDDF33CCACF8520FD5879FCDAE37BD86 overflow=visible><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 5.46875 L 1.8505859 5.46875 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z"/></symbol><symbol id=gF2D21C82F46AFB157CA5E1AB14665E2F overflow=visible><path d="M 2.1289063 0.8105469 Q 3.3740234 0.8105469 3.8671875 1.4233398 Q 4.3603516 2.0361328 4.3603516 3.6376953 Q 4.3603516 5.2539063 3.869629 5.866699 Q 3.3789063 6.479492 2.1289063 6.479492 L 1.6601563 6.479492 L 1.6601563 0.8105469 L 2.1289063 0.8105469 Z M 2.1484375 7.290039 Q 3.8183594 7.290039 4.609375 6.401367 Q 5.4003906 5.5126953 5.4003906 3.6376953 Q 5.4003906 1.7724609 4.609375 0.88623047 Q 3.8183594 0 2.1484375 0 L 0.6689453 0 L 0.6689453 7.290039 L 2.1484375 7.290039 Z"/></symbol><symbol id=g23E41626515445E1BB7071D28C59ADA4 overflow=visible><path d="M 4.7509766 5.2783203 L 4.7509766 4.399414 Q 4.3652344 4.6240234 3.9746094 4.736328 Q 3.5839844 4.848633 3.178711 4.848633 Q 2.5683594 4.848633 2.2680664 4.650879 Q 1.9677734 4.453125 1.9677734 4.0478516 Q 1.9677734 3.6816406 2.1923828 3.5009766 Q 2.4169922 3.3203125 3.3105469 3.149414 L 3.671875 3.0810547 Q 4.3408203 2.9541016 4.6850586 2.5732422 Q 5.029297 2.1923828 5.029297 1.5820313 Q 5.029297 0.7714844 4.453125 0.3149414 Q 3.8769531 -0.14160156 2.8515625 -0.14160156 Q 2.446289 -0.14160156 2.0019531 -0.056152344 Q 1.5576172 0.029296875 1.0400391 0.20019531 L 1.0400391 1.1279297 Q 1.5429688 0.8691406 2.0019531 0.7397461 Q 2.4609375 0.61035156 2.8710938 0.61035156 Q 3.4667969 0.61035156 3.7939453 0.8520508 Q 4.1210938 1.09375 4.1210938 1.5283203 Q 4.1210938 2.1533203 2.9248047 2.3925781 L 2.8857422 2.4023438 L 2.5488281 2.4707031 Q 1.7724609 2.6220703 1.4160156 2.980957 Q 1.0595703 3.3398438 1.0595703 3.959961 Q 1.0595703 4.7460938 1.5917969 5.17334 Q 2.1240234 5.600586 3.1103516 5.600586 Q 3.5498047 5.600586 3.9550781 5.5200195 Q 4.3603516 5.439453 4.7509766 5.2783203 Z"/></symbol><symbol id=gAB79A30431405AF14CCB1B23143BD7F1 overflow=visible><path d="M 5.180664 0.2783203 Q 4.819336 0.068359375 4.436035 -0.036621094 Q 4.0527344 -0.14160156 3.6523438 -0.14160156 Q 2.3828125 -0.14160156 1.6674805 0.6201172 Q 0.95214844 1.3818359 0.95214844 2.7294922 Q 0.95214844 4.0771484 1.6674805 4.838867 Q 2.3828125 5.600586 3.6523438 5.600586 Q 4.0478516 5.600586 4.423828 5.498047 Q 4.7998047 5.395508 5.180664 5.180664 L 5.180664 4.2382813 Q 4.8242188 4.555664 4.465332 4.6972656 Q 4.1064453 4.838867 3.6523438 4.838867 Q 2.8076172 4.838867 2.3535156 4.291992 Q 1.8994141 3.7451172 1.8994141 2.7294922 Q 1.8994141 1.71875 2.355957 1.1694336 Q 2.8125 0.6201172 3.6523438 0.6201172 Q 4.1210938 0.6201172 4.4921875 0.76416016 Q 4.8632813 0.9082031 5.180664 1.2109375 L 5.180664 0.2783203 Z"/></symbol><symbol id=gF1D16D3439F586916205801D07D97589 overflow=visible><path d="M 1.25 5.46875 L 3.5498047 5.46875 L 3.5498047 0.6982422 L 5.3320313 0.6982422 L 5.3320313 0 L 0.8691406 0 L 0.8691406 0.6982422 L 2.6513672 0.6982422 L 2.6513672 4.770508 L 1.25 4.770508 L 1.25 5.46875 Z M 2.6513672 7.5976563 L 3.5498047 7.5976563 L 3.5498047 6.459961 L 2.6513672 6.459961 L 2.6513672 7.5976563 Z"/></symbol><symbol id=gC5CB98F12AF1494D83D230F6647F5A66 overflow=visible><path d="M 1.8310547 0.68847656 L 1.8310547 -2.0800781 L 0.9277344 -2.0800781 L 0.9277344 5.46875 L 1.8310547 5.46875 L 1.8310547 4.770508 Q 2.055664 5.1757813 2.4291992 5.3881836 Q 2.8027344 5.600586 3.2910156 5.600586 Q 4.2822266 5.600586 4.8461914 4.8339844 Q 5.4101563 4.067383 5.4101563 2.709961 Q 5.4101563 1.3769531 4.84375 0.6176758 Q 4.2773438 -0.14160156 3.2910156 -0.14160156 Q 2.7929688 -0.14160156 2.4194336 0.07080078 Q 2.0458984 0.28320313 1.8310547 0.68847656 Z M 4.4677734 2.7294922 Q 4.4677734 3.774414 4.1381836 4.3066406 Q 3.8085938 4.838867 3.1591797 4.838867 Q 2.5048828 4.838867 2.1679688 4.304199 Q 1.8310547 3.7695313 1.8310547 2.7294922 Q 1.8310547 1.6943359 2.1679688 1.1572266 Q 2.5048828 0.6201172 3.1591797 0.6201172 Q 3.8085938 0.6201172 4.1381836 1.1523438 Q 4.4677734 1.6845703 4.4677734 2.7294922 Z"/></symbol><symbol id=gDAC4E5B9EA78940BD8041CFC64F1642E overflow=visible><path d="M 3.0078125 4.838867 Q 2.3242188 4.838867 1.9726563 4.3066406 Q 1.6210938 3.774414 1.6210938 2.7294922 Q 1.6210938 1.6894531 1.9726563 1.1547852 Q 2.3242188 0.6201172 3.0078125 0.6201172 Q 3.696289 0.6201172 4.0478516 1.1547852 Q 4.399414 1.6894531 4.399414 2.7294922 Q 4.399414 3.774414 4.0478516 4.3066406 Q 3.696289 4.838867 3.0078125 4.838867 Z M 3.0078125 5.600586 Q 4.145508 5.600586 4.748535 4.8632813 Q 5.3515625 4.1259766 5.3515625 2.7294922 Q 5.3515625 1.328125 4.7509766 0.5932617 Q 4.1503906 -0.14160156 3.0078125 -0.14160156 Q 1.8701172 -0.14160156 1.2695313 0.5932617 Q 0.6689453 1.328125 0.6689453 2.7294922 Q 0.6689453 4.1259766 1.2695313 4.8632813 Q 1.8701172 5.600586 3.0078125 5.600586 Z"/></symbol><symbol id=gD3E02A90146443F5D1C908F343BC0F25 overflow=visible><path d="M 1.1445313 5.8320313 L 4.2148438 -0.7421875 L 3.4726563 -0.7421875 L 0.3984375 5.8320313 L 1.1445313 5.8320313 Z"/></symbol><symbol id=gB83FD8DF61FB2E4EAD552878F3E8DD3F overflow=visible><path d="M 3.3007813 4.9121094 Q 3.4667969 5.263672 3.7231445 5.432129 Q 3.9794922 5.600586 4.3408203 5.600586 Q 5 5.600586 5.270996 5.090332 Q 5.541992 4.580078 5.541992 3.1689453 L 5.541992 0 L 4.7216797 0 L 4.7216797 3.1298828 Q 4.7216797 4.2871094 4.592285 4.567871 Q 4.4628906 4.848633 4.1210938 4.848633 Q 3.7304688 4.848633 3.5864258 4.54834 Q 3.4423828 4.248047 3.4423828 3.1298828 L 3.4423828 0 L 2.6220703 0 L 2.6220703 3.1298828 Q 2.6220703 4.301758 2.4829102 4.5751953 Q 2.34375 4.848633 1.9824219 4.848633 Q 1.6259766 4.848633 1.4868164 4.54834 Q 1.3476563 4.248047 1.3476563 3.1298828 L 1.3476563 0 L 0.53222656 0 L 0.53222656 5.46875 L 1.3476563 5.46875 L 1.3476563 5 Q 1.5087891 5.2929688 1.7504883 5.4467773 Q 1.9921875 5.600586 2.2998047 5.600586 Q 2.6708984 5.600586 2.9174805 5.4296875 Q 3.1640625 5.258789 3.3007813 4.9121094 Z"/></symbol><symbol id=g54B52F8AE89AD429D6D3AD95B2D89739 overflow=visible><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 7.5976563 L 1.8505859 7.5976563 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z"/></symbol><symbol id=g961CAE06C7AAE8EB428417D81D5AEE72 overflow=visible><path d="M 3.1201172 1.9824219 Q 3.1201172 1.3769531 3.3422852 1.0693359 Q 3.5644531 0.76171875 3.9990234 0.76171875 L 5.048828 0.76171875 L 5.048828 0 L 3.9111328 0 Q 3.1054688 0 2.6635742 0.5175781 Q 2.2216797 1.0351563 2.2216797 1.9824219 L 2.2216797 6.948242 L 0.78125 6.948242 L 0.78125 7.651367 L 3.1201172 7.651367 L 3.1201172 1.9824219 Z"/></symbol><symbol id=g77AA3201A93C8F4113E19CCDA185B6F5 overflow=visible><path d="M 4.482422 2.7294922 Q 4.482422 3.774414 4.1503906 4.3066406 Q 3.8183594 4.838867 3.1689453 4.838867 Q 2.5146484 4.838867 2.1777344 4.304199 Q 1.8408203 3.7695313 1.8408203 2.7294922 Q 1.8408203 1.6943359 2.1777344 1.1572266 Q 2.5146484 0.6201172 3.1689453 0.6201172 Q 3.8183594 0.6201172 4.1503906 1.1523438 Q 4.482422 1.6845703 4.482422 2.7294922 Z M 1.8408203 4.770508 Q 2.055664 5.1708984 2.434082 5.385742 Q 2.8125 5.600586 3.3105469 5.600586 Q 4.296875 5.600586 4.8632813 4.8413086 Q 5.4296875 4.0820313 5.4296875 2.7490234 Q 5.4296875 1.3964844 4.86084 0.6274414 Q 4.291992 -0.14160156 3.3007813 -0.14160156 Q 2.8125 -0.14160156 2.4389648 0.07080078 Q 2.0654297 0.28320313 1.8408203 0.68847656 L 1.8408203 0 L 0.9423828 0 L 0.9423828 7.5976563 L 1.8408203 7.5976563 L 1.8408203 4.770508 Z"/></symbol><symbol id=g958F64BF87063D7EAFEDE953DDA2BF9F overflow=visible><path d="M 1.1523438 7.5976563 L 2.0800781 7.5976563 L 2.0800781 3.1982422 L 4.4384766 5.46875 L 5.5322266 5.46875 L 3.3789063 3.4082031 L 5.8691406 0 L 4.770508 0 L 2.7490234 2.8222656 L 2.0800781 2.1923828 L 2.0800781 0 L 1.1523438 0 L 1.1523438 7.5976563 Z"/></symbol><symbol id=g1E73FB87418835A88E58B2B7006EB72B overflow=visible><path d="M 4.1054688 2.7109375 L 4.1054688 0 L 3.3828125 0 L 3.3828125 2.7109375 Q 3.3828125 3.3007813 3.1757813 3.578125 Q 2.96875 3.8554688 2.5273438 3.8554688 Q 2.0234375 3.8554688 1.7519531 3.4980469 Q 1.4804688 3.140625 1.4804688 2.4726563 L 1.4804688 0 L 0.76171875 0 L 0.76171875 4.375 L 1.4804688 4.375 L 1.4804688 3.71875 Q 1.671875 4.09375 2 4.2871094 Q 2.328125 4.4804688 2.7773438 4.4804688 Q 3.4453125 4.4804688 3.7753906 4.0410156 Q 4.1054688 3.6015625 4.1054688 2.7109375 Z"/></symbol><symbol id=g3D5EE249F6894FA38DD21E85E2FD5F05 overflow=visible><path d="M 0 5.46875 L 0.8886719 5.46875 L 1.8408203 1.0498047 L 2.6220703 3.8720703 L 3.3886719 3.8720703 L 4.1796875 1.0498047 L 5.131836 5.46875 L 6.020508 5.46875 L 4.741211 0 L 3.881836 0 L 3.0078125 2.9980469 L 2.1386719 0 L 1.2792969 0 L 0 5.46875 Z"/></symbol><symbol id=gD77243764E4306BD6D683907293F12D5 overflow=visible><path d="M 1.7382813 3.1396484 L 4.2822266 3.1396484 L 4.2822266 2.3388672 L 1.7382813 2.3388672 L 1.7382813 3.1396484 Z"/></symbol></defs></svg></div><div><p><br><span id=char-groups style=text-decoration:underline><h4>Character Groups</h4></span> RegEx engines already define some groups of characters that can make writing RegEx expressions quicker.</p><svg viewbox="0 0 405.3125 200.14453125" class=typst-frame height=200.14453125pt style=width:40.5313em;height:20.0145em;overflow:visible width=405.3125pt xmlns=http://www.w3.org/2000/svg xmlns:h5=http://www.w3.org/1999/xhtml xmlns:xlink=http://www.w3.org/1999/xlink><g><g transform="translate(0 0)"><g class=typst-group><g><g transform="translate(0 -0.5)"><path d="M 0 0 L 0 201.14453" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(52.1435546875 -0.5)"><path d="M 0 0 L 0 201.14453" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(405.3125 -0.5)"><path d="M 0 0 L 0 201.14453" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 0)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 17.59765625)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 43.67578125)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 69.75390625)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 95.83203125)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 121.91015625)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 147.98828125)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 174.06640625)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 200.14453125)"><path d="M 0 0 L 406.3125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gA9630BC7DC7C1A3B2772AC4EAF5E6A4E y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gF2D21C82F46AFB157CA5E1AB14665E2F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /></g></g><g transform="translate(0 17.59765625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 13.316406 0 C 14.144834 0 14.816406 0.67157286 14.816406 1.5 L 14.816406 14.578125 C 14.816406 15.406552 14.144834 16.078125 13.316406 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gE671651E4E76A7E6A66592123F7CB0EF y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g1FA38BF5C517F615C367E61F0044A197 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#gBB49C9F26722473D147EE93A203A972A y=0 /><use fill=#000000 fill-rule=nonzero x=96.328125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=114.3896484375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#g1D505C2B8EC47EA4C26743DADEC508A3 y=0 /><use fill=#000000 fill-rule=nonzero x=132.451171875 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=150.5126953125 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=156.533203125 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=162.5537109375 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=168.57421875 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=180.615234375 xlink:href=#g77AA3201A93C8F4113E19CCDA185B6F5 y=0 /><use fill=#000000 fill-rule=nonzero x=186.6357421875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=192.65625 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=198.6767578125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#g958F64BF87063D7EAFEDE953DDA2BF9F y=0 /><use fill=#000000 fill-rule=nonzero x=210.7177734375 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /></g></g></g></g></g><g transform="translate(0 43.67578125)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#d73a49 fill-rule=nonzero x=4.81640625 xlink:href=#gC58E40CCEEAAE4A011790927FE560B0C y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g1FA38BF5C517F615C367E61F0044A197 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g3D5EE249F6894FA38DD21E85E2FD5F05 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=78.2666015625 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=96.328125 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=114.3896484375 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=120.41015625 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#g77AA3201A93C8F4113E19CCDA185B6F5 y=0 /><use fill=#000000 fill-rule=nonzero x=144.4921875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=150.5126953125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=156.533203125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=162.5537109375 xlink:href=#g958F64BF87063D7EAFEDE953DDA2BF9F y=0 /></g></g></g></g></g><g transform="translate(0 69.75390625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#d73a49 fill-rule=nonzero x=4.81640625 xlink:href=#gF953090ED8E474A6BDB5C112B8614419 y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g1FA38BF5C517F615C367E61F0044A197 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#gBB49C9F26722473D147EE93A203A972A y=0 /><use fill=#000000 fill-rule=nonzero x=96.328125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=114.3896484375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#g3D5EE249F6894FA38DD21E85E2FD5F05 y=0 /><use fill=#000000 fill-rule=nonzero x=132.451171875 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=144.4921875 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=150.5126953125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=156.533203125 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=162.5537109375 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=168.57421875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=174.5947265625 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=180.615234375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=186.6357421875 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=198.6767578125 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=216.73828125 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=222.7587890625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=228.779296875 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=234.7998046875 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=246.8408203125 xlink:href=#g77AA3201A93C8F4113E19CCDA185B6F5 y=0 /><use fill=#000000 fill-rule=nonzero x=252.861328125 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=258.8818359375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=264.90234375 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=270.9228515625 xlink:href=#g958F64BF87063D7EAFEDE953DDA2BF9F y=0 /><use fill=#000000 fill-rule=nonzero x=276.943359375 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /></g></g></g></g></g><g transform="translate(0 95.83203125)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#d73a49 fill-rule=nonzero x=4.81640625 xlink:href=#gF5F7ADACD3C8648021D0891B6403D353 y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g1FA38BF5C517F615C367E61F0044A197 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g9E9C649267338B7BCF3BB51B9816396A y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g1D505C2B8EC47EA4C26743DADEC508A3 y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=78.2666015625 xlink:href=#gB83FD8DF61FB2E4EAD552878F3E8DD3F y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#g807B89443FA0EF4D7A7A613982FE96F6 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=120.41015625 xlink:href=#gA06F636B71996BA7070F256843DCE7EE y=0 /></g></g></g></g></g><g transform="translate(0 121.91015625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#d73a49 fill-rule=nonzero x=4.81640625 xlink:href=#g27C321132E0A6A9E6B99ED77584BAD53 y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g1FA38BF5C517F615C367E61F0044A197 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#gBB49C9F26722473D147EE93A203A972A y=0 /><use fill=#000000 fill-rule=nonzero x=96.328125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=114.3896484375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=132.451171875 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#g9E9C649267338B7BCF3BB51B9816396A y=0 /><use fill=#000000 fill-rule=nonzero x=144.4921875 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=150.5126953125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=156.533203125 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=168.57421875 xlink:href=#g1D505C2B8EC47EA4C26743DADEC508A3 y=0 /><use fill=#000000 fill-rule=nonzero x=174.5947265625 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=180.615234375 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=186.6357421875 xlink:href=#gB83FD8DF61FB2E4EAD552878F3E8DD3F y=0 /><use fill=#000000 fill-rule=nonzero x=198.6767578125 xlink:href=#g807B89443FA0EF4D7A7A613982FE96F6 y=0 /><use fill=#000000 fill-rule=nonzero x=210.7177734375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=216.73828125 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=228.779296875 xlink:href=#gA06F636B71996BA7070F256843DCE7EE y=0 /></g></g></g></g></g><g transform="translate(0 147.98828125)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#d73a49 fill-rule=nonzero x=4.81640625 xlink:href=#g7342E383B6C704BD4B47D4672216B35D y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=18.0615234375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#gC5F336A8E4AF2A41DBA4980BEB90D9CD y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g9E9C649267338B7BCF3BB51B9816396A y=0 /><use fill=#000000 fill-rule=nonzero x=78.2666015625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#gC5F336A8E4AF2A41DBA4980BEB90D9CD y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=120.41015625 xlink:href=#g952AB916CC2FCD530DE73925A36C7F0D y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=132.451171875 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=144.4921875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=150.5126953125 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=156.533203125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=162.5537109375 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=168.57421875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=174.5947265625 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /></g></g></g></g></g><g transform="translate(0 174.06640625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 18.132813 0 C 18.961239 0 19.632813 0.67157286 19.632813 1.5 L 19.632813 14.578125 C 19.632813 15.406552 18.961239 16.078125 18.132813 16.078125 L 1.5 16.078125 C 0.67157286 16.078125 0 15.406552 0 14.578125 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 11.078125)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gD3E02A90146443F5D1C908F343BC0F25 y=0 /><use fill=#d73a49 fill-rule=nonzero x=4.81640625 xlink:href=#g9A4F7CA79966390D26B2F6FED68DC851 y=0 /></g></g></g></g></g><g transform="translate(57.1435546875 12.59765625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=6.0205078125 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=12.041015625 xlink:href=#g1FA38BF5C517F615C367E61F0044A197 y=0 /><use fill=#000000 fill-rule=nonzero x=24.08203125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=30.1025390625 xlink:href=#g54B52F8AE89AD429D6D3AD95B2D89739 y=0 /><use fill=#000000 fill-rule=nonzero x=36.123046875 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=42.1435546875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=48.1640625 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=54.1845703125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=60.205078125 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=66.2255859375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=72.24609375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=84.287109375 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=90.3076171875 xlink:href=#gBB49C9F26722473D147EE93A203A972A y=0 /><use fill=#000000 fill-rule=nonzero x=96.328125 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=108.369140625 xlink:href=#gC5CB98F12AF1494D83D230F6647F5A66 y=0 /><use fill=#000000 fill-rule=nonzero x=114.3896484375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=126.4306640625 xlink:href=#g1D505C2B8EC47EA4C26743DADEC508A3 y=0 /><use fill=#000000 fill-rule=nonzero x=132.451171875 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=138.4716796875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=150.5126953125 xlink:href=#g961CAE06C7AAE8EB428417D81D5AEE72 y=0 /><use fill=#000000 fill-rule=nonzero x=156.533203125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=162.5537109375 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=168.57421875 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=174.5947265625 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=180.615234375 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=186.6357421875 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=192.65625 xlink:href=#gC5F336A8E4AF2A41DBA4980BEB90D9CD y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=210.7177734375 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=216.73828125 xlink:href=#g9E9C649267338B7BCF3BB51B9816396A y=0 /><use fill=#000000 fill-rule=nonzero x=222.7587890625 xlink:href=#gF1D16D3439F586916205801D07D97589 y=0 /><use fill=#000000 fill-rule=nonzero x=228.779296875 xlink:href=#g8EFE1C4A2E0CD0A03B7633D0C324134A y=0 /><use fill=#000000 fill-rule=nonzero x=234.7998046875 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=240.8203125 xlink:href=#gC5F336A8E4AF2A41DBA4980BEB90D9CD y=0 /><use fill=#000000 fill-rule=nonzero x=252.861328125 xlink:href=#g37BF1C0F714F2658F35D194C9E053C6F y=0 /><use fill=#000000 fill-rule=nonzero x=258.8818359375 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=264.90234375 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=276.943359375 xlink:href=#g952AB916CC2FCD530DE73925A36C7F0D y=0 /><use fill=#000000 fill-rule=nonzero x=282.9638671875 xlink:href=#gDDF33CCACF8520FD5879FCDAE37BD86 y=0 /><use fill=#000000 fill-rule=nonzero x=288.984375 xlink:href=#g3402EB21D38B9A8AFC4DFC6262792511 y=0 /><use fill=#000000 fill-rule=nonzero x=295.0048828125 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=301.025390625 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=307.0458984375 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /><use fill=#000000 fill-rule=nonzero x=313.06640625 xlink:href=#gAB79A30431405AF14CCB1B23143BD7F1 y=0 /><use fill=#000000 fill-rule=nonzero x=319.0869140625 xlink:href=#gDAC4E5B9EA78940BD8041CFC64F1642E y=0 /><use fill=#000000 fill-rule=nonzero x=325.107421875 xlink:href=#g8B1CFD5A71F51FD444694A31ACE7ED10 y=0 /><use fill=#000000 fill-rule=nonzero x=331.1279296875 xlink:href=#g9CEA08D585A10BDF30AE748A6F2738E3 y=0 /><use fill=#000000 fill-rule=nonzero x=337.1484375 xlink:href=#g23E41626515445E1BB7071D28C59ADA4 y=0 /></g></g></g></g></g></g></g></g></g><defs id=glyph><symbol id=gA9630BC7DC7C1A3B2772AC4EAF5E6A4E overflow=visible><path d="M 1.9482422 6.479492 L 1.9482422 3.7402344 L 3.0908203 3.7402344 Q 3.774414 3.7402344 4.157715 4.1015625 Q 4.5410156 4.4628906 4.5410156 5.1123047 Q 4.5410156 5.7617188 4.1601563 6.1206055 Q 3.7792969 6.479492 3.0908203 6.479492 L 1.9482422 6.479492 Z M 0.96191406 7.290039 L 3.0908203 7.290039 Q 4.3115234 7.290039 4.9414063 6.73584 Q 5.571289 6.1816406 5.571289 5.1123047 Q 5.571289 4.033203 4.9438477 3.4814453 Q 4.3164063 2.9296875 3.0908203 2.9296875 L 1.9482422 2.9296875 L 1.9482422 0 L 0.96191406 0 L 0.96191406 7.290039 Z"/></symbol><symbol id=g37BF1C0F714F2658F35D194C9E053C6F overflow=visible><path d="M 3.4277344 2.7490234 L 3.1298828 2.7490234 Q 2.34375 2.7490234 1.9458008 2.4731445 Q 1.5478516 2.1972656 1.5478516 1.6503906 Q 1.5478516 1.1572266 1.8457031 0.88378906 Q 2.1435547 0.61035156 2.6708984 0.61035156 Q 3.413086 0.61035156 3.8378906 1.1254883 Q 4.2626953 1.640625 4.267578 2.5488281 L 4.267578 2.7490234 L 3.4277344 2.7490234 Z M 5.1708984 3.1201172 L 5.1708984 0 L 4.267578 0 L 4.267578 0.8105469 Q 3.9794922 0.32226563 3.5424805 0.09033203 Q 3.1054688 -0.14160156 2.4804688 -0.14160156 Q 1.6455078 -0.14160156 1.1474609 0.32958984 Q 0.64941406 0.80078125 0.64941406 1.5917969 Q 0.64941406 2.5048828 1.262207 2.9785156 Q 1.875 3.4521484 3.0615234 3.4521484 L 4.267578 3.4521484 L 4.267578 3.59375 Q 4.2626953 4.248047 3.9355469 4.543457 Q 3.6083984 4.838867 2.890625 4.838867 Q 2.4316406 4.838867 1.9628906 4.7070313 Q 1.4941406 4.5751953 1.0498047 4.321289 L 1.0498047 5.2197266 Q 1.5478516 5.4101563 2.0043945 5.505371 Q 2.4609375 5.600586 2.890625 5.600586 Q 3.569336 5.600586 4.050293 5.4003906 Q 4.53125 5.2001953 4.8291016 4.7998047 Q 5.0146484 4.555664 5.0927734 4.1967773 Q 5.1708984 3.8378906 5.1708984 3.1201172 Z"/></symbol><symbol id=g8EFE1C4A2E0CD0A03B7633D0C324134A overflow=visible><path d="M 2.9980469 7.0214844 L 2.9980469 5.46875 L 5.0390625 5.46875 L 5.0390625 4.770508 L 2.9980469 4.770508 L 2.9980469 1.8017578 Q 2.9980469 1.1962891 3.227539 0.95703125 Q 3.4570313 0.71777344 4.0283203 0.71777344 L 5.0390625 0.71777344 L 5.0390625 0 L 3.9404297 0 Q 2.9296875 0 2.5146484 0.40527344 Q 2.0996094 0.8105469 2.0996094 1.8017578 L 2.0996094 4.770508 L 0.63964844 4.770508 L 0.63964844 5.46875 L 2.0996094 5.46875 L 2.0996094 7.0214844 L 2.9980469 7.0214844 Z"/></symbol><symbol id=g9CEA08D585A10BDF30AE748A6F2738E3 overflow=visible><path d="M 5.4296875 2.9589844 L 5.4296875 2.5195313 L 1.5380859 2.5195313 L 1.5380859 2.4902344 Q 1.5380859 1.5966797 2.0043945 1.1083984 Q 2.4707031 0.6201172 3.3203125 0.6201172 Q 3.75 0.6201172 4.21875 0.75683594 Q 4.6875 0.8935547 5.2197266 1.171875 L 5.2197266 0.2783203 Q 4.7070313 0.068359375 4.230957 -0.036621094 Q 3.7548828 -0.14160156 3.3105469 -0.14160156 Q 2.0361328 -0.14160156 1.3183594 0.6225586 Q 0.60058594 1.3867188 0.60058594 2.7294922 Q 0.60058594 4.038086 1.3037109 4.819336 Q 2.006836 5.600586 3.178711 5.600586 Q 4.223633 5.600586 4.82666 4.892578 Q 5.4296875 4.1845703 5.4296875 2.9589844 Z M 4.53125 3.2226563 Q 4.5117188 4.013672 4.157715 4.4262695 Q 3.803711 4.838867 3.1396484 4.838867 Q 2.4902344 4.838867 2.0703125 4.4091797 Q 1.6503906 3.9794922 1.5722656 3.2177734 L 4.53125 3.2226563 Z"/></symbol><symbol id=g8B1CFD5A71F51FD444694A31ACE7ED10 overflow=visible><path d="M 5.6396484 4.3408203 Q 5.3515625 4.5654297 5.053711 4.6679688 Q 4.7558594 4.770508 4.399414 4.770508 Q 3.5595703 4.770508 3.1152344 4.243164 Q 2.6708984 3.7158203 2.6708984 2.7197266 L 2.6708984 0 L 1.7675781 0 L 1.7675781 5.46875 L 2.6708984 5.46875 L 2.6708984 4.399414 Q 2.8955078 4.9804688 3.3618164 5.2905273 Q 3.828125 5.600586 4.4677734 5.600586 Q 4.7998047 5.600586 5.0878906 5.517578 Q 5.3759766 5.4345703 5.6396484 5.258789 L 5.6396484 4.3408203 Z"/></symbol><symbol id=gDDF33CCACF8520FD5879FCDAE37BD86 overflow=visible><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 5.46875 L 1.8505859 5.46875 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z"/></symbol><symbol id=gF2D21C82F46AFB157CA5E1AB14665E2F overflow=visible><path d="M 2.1289063 0.8105469 Q 3.3740234 0.8105469 3.8671875 1.4233398 Q 4.3603516 2.0361328 4.3603516 3.6376953 Q 4.3603516 5.2539063 3.869629 5.866699 Q 3.3789063 6.479492 2.1289063 6.479492 L 1.6601563 6.479492 L 1.6601563 0.8105469 L 2.1289063 0.8105469 Z M 2.1484375 7.290039 Q 3.8183594 7.290039 4.609375 6.401367 Q 5.4003906 5.5126953 5.4003906 3.6376953 Q 5.4003906 1.7724609 4.609375 0.88623047 Q 3.8183594 0 2.1484375 0 L 0.6689453 0 L 0.6689453 7.290039 L 2.1484375 7.290039 Z"/></symbol><symbol id=g23E41626515445E1BB7071D28C59ADA4 overflow=visible><path d="M 4.7509766 5.2783203 L 4.7509766 4.399414 Q 4.3652344 4.6240234 3.9746094 4.736328 Q 3.5839844 4.848633 3.178711 4.848633 Q 2.5683594 4.848633 2.2680664 4.650879 Q 1.9677734 4.453125 1.9677734 4.0478516 Q 1.9677734 3.6816406 2.1923828 3.5009766 Q 2.4169922 3.3203125 3.3105469 3.149414 L 3.671875 3.0810547 Q 4.3408203 2.9541016 4.6850586 2.5732422 Q 5.029297 2.1923828 5.029297 1.5820313 Q 5.029297 0.7714844 4.453125 0.3149414 Q 3.8769531 -0.14160156 2.8515625 -0.14160156 Q 2.446289 -0.14160156 2.0019531 -0.056152344 Q 1.5576172 0.029296875 1.0400391 0.20019531 L 1.0400391 1.1279297 Q 1.5429688 0.8691406 2.0019531 0.7397461 Q 2.4609375 0.61035156 2.8710938 0.61035156 Q 3.4667969 0.61035156 3.7939453 0.8520508 Q 4.1210938 1.09375 4.1210938 1.5283203 Q 4.1210938 2.1533203 2.9248047 2.3925781 L 2.8857422 2.4023438 L 2.5488281 2.4707031 Q 1.7724609 2.6220703 1.4160156 2.980957 Q 1.0595703 3.3398438 1.0595703 3.959961 Q 1.0595703 4.7460938 1.5917969 5.17334 Q 2.1240234 5.600586 3.1103516 5.600586 Q 3.5498047 5.600586 3.9550781 5.5200195 Q 4.3603516 5.439453 4.7509766 5.2783203 Z"/></symbol><symbol id=gAB79A30431405AF14CCB1B23143BD7F1 overflow=visible><path d="M 5.180664 0.2783203 Q 4.819336 0.068359375 4.436035 -0.036621094 Q 4.0527344 -0.14160156 3.6523438 -0.14160156 Q 2.3828125 -0.14160156 1.6674805 0.6201172 Q 0.95214844 1.3818359 0.95214844 2.7294922 Q 0.95214844 4.0771484 1.6674805 4.838867 Q 2.3828125 5.600586 3.6523438 5.600586 Q 4.0478516 5.600586 4.423828 5.498047 Q 4.7998047 5.395508 5.180664 5.180664 L 5.180664 4.2382813 Q 4.8242188 4.555664 4.465332 4.6972656 Q 4.1064453 4.838867 3.6523438 4.838867 Q 2.8076172 4.838867 2.3535156 4.291992 Q 1.8994141 3.7451172 1.8994141 2.7294922 Q 1.8994141 1.71875 2.355957 1.1694336 Q 2.8125 0.6201172 3.6523438 0.6201172 Q 4.1210938 0.6201172 4.4921875 0.76416016 Q 4.8632813 0.9082031 5.180664 1.2109375 L 5.180664 0.2783203 Z"/></symbol><symbol id=gF1D16D3439F586916205801D07D97589 overflow=visible><path d="M 1.25 5.46875 L 3.5498047 5.46875 L 3.5498047 0.6982422 L 5.3320313 0.6982422 L 5.3320313 0 L 0.8691406 0 L 0.8691406 0.6982422 L 2.6513672 0.6982422 L 2.6513672 4.770508 L 1.25 4.770508 L 1.25 5.46875 Z M 2.6513672 7.5976563 L 3.5498047 7.5976563 L 3.5498047 6.459961 L 2.6513672 6.459961 L 2.6513672 7.5976563 Z"/></symbol><symbol id=gC5CB98F12AF1494D83D230F6647F5A66 overflow=visible><path d="M 1.8310547 0.68847656 L 1.8310547 -2.0800781 L 0.9277344 -2.0800781 L 0.9277344 5.46875 L 1.8310547 5.46875 L 1.8310547 4.770508 Q 2.055664 5.1757813 2.4291992 5.3881836 Q 2.8027344 5.600586 3.2910156 5.600586 Q 4.2822266 5.600586 4.8461914 4.8339844 Q 5.4101563 4.067383 5.4101563 2.709961 Q 5.4101563 1.3769531 4.84375 0.6176758 Q 4.2773438 -0.14160156 3.2910156 -0.14160156 Q 2.7929688 -0.14160156 2.4194336 0.07080078 Q 2.0458984 0.28320313 1.8310547 0.68847656 Z M 4.4677734 2.7294922 Q 4.4677734 3.774414 4.1381836 4.3066406 Q 3.8085938 4.838867 3.1591797 4.838867 Q 2.5048828 4.838867 2.1679688 4.304199 Q 1.8310547 3.7695313 1.8310547 2.7294922 Q 1.8310547 1.6943359 2.1679688 1.1572266 Q 2.5048828 0.6201172 3.1591797 0.6201172 Q 3.8085938 0.6201172 4.1381836 1.1523438 Q 4.4677734 1.6845703 4.4677734 2.7294922 Z"/></symbol><symbol id=gDAC4E5B9EA78940BD8041CFC64F1642E overflow=visible><path d="M 3.0078125 4.838867 Q 2.3242188 4.838867 1.9726563 4.3066406 Q 1.6210938 3.774414 1.6210938 2.7294922 Q 1.6210938 1.6894531 1.9726563 1.1547852 Q 2.3242188 0.6201172 3.0078125 0.6201172 Q 3.696289 0.6201172 4.0478516 1.1547852 Q 4.399414 1.6894531 4.399414 2.7294922 Q 4.399414 3.774414 4.0478516 4.3066406 Q 3.696289 4.838867 3.0078125 4.838867 Z M 3.0078125 5.600586 Q 4.145508 5.600586 4.748535 4.8632813 Q 5.3515625 4.1259766 5.3515625 2.7294922 Q 5.3515625 1.328125 4.7509766 0.5932617 Q 4.1503906 -0.14160156 3.0078125 -0.14160156 Q 1.8701172 -0.14160156 1.2695313 0.5932617 Q 0.6689453 1.328125 0.6689453 2.7294922 Q 0.6689453 4.1259766 1.2695313 4.8632813 Q 1.8701172 5.600586 3.0078125 5.600586 Z"/></symbol><symbol id=gE671651E4E76A7E6A66592123F7CB0EF overflow=visible><path d="M 1.9101563 1.1914063 L 2.8945313 1.1914063 L 2.8945313 0 L 1.9101563 0 L 1.9101563 1.1914063 Z"/></symbol><symbol id=g1FA38BF5C517F615C367E61F0044A197 overflow=visible><path d="M 4.189453 1.7578125 Q 3.9648438 1.1865234 3.618164 0.25390625 Q 3.1347656 -1.0351563 2.96875 -1.3183594 Q 2.7441406 -1.6992188 2.4072266 -1.8896484 Q 2.0703125 -2.0800781 1.6210938 -2.0800781 L 0.8984375 -2.0800781 L 0.8984375 -1.328125 L 1.4306641 -1.328125 Q 1.8261719 -1.328125 2.0507813 -1.0986328 Q 2.2753906 -0.8691406 2.6220703 0.087890625 L 0.5078125 5.46875 L 1.4599609 5.46875 L 3.0810547 1.1914063 L 4.6777344 5.46875 L 5.629883 5.46875 L 4.189453 1.7578125 Z"/></symbol><symbol id=g54B52F8AE89AD429D6D3AD95B2D89739 overflow=visible><path d="M 5.131836 3.3886719 L 5.131836 0 L 4.2285156 0 L 4.2285156 3.3886719 Q 4.2285156 4.1259766 3.9697266 4.4726563 Q 3.7109375 4.819336 3.1591797 4.819336 Q 2.5292969 4.819336 2.1899414 4.3725586 Q 1.8505859 3.9257813 1.8505859 3.0908203 L 1.8505859 0 L 0.95214844 0 L 0.95214844 7.5976563 L 1.8505859 7.5976563 L 1.8505859 4.6484375 Q 2.0898438 5.1171875 2.5 5.3588867 Q 2.9101563 5.600586 3.4716797 5.600586 Q 4.3066406 5.600586 4.7192383 5.0512695 Q 5.131836 4.501953 5.131836 3.3886719 Z"/></symbol><symbol id=gBB49C9F26722473D147EE93A203A972A overflow=visible><path d="M 5.4589844 5.46875 L 3.5009766 2.8515625 L 5.649414 0 L 4.609375 0 L 3.0078125 2.1923828 L 1.4111328 0 L 0.37109375 0 L 2.5195313 2.8515625 L 0.56152344 5.46875 L 1.5576172 5.46875 L 3.0078125 3.491211 L 4.448242 5.46875 L 5.4589844 5.46875 Z"/></symbol><symbol id=g1D505C2B8EC47EA4C26743DADEC508A3 overflow=visible><path d="M 5.1904297 7.5976563 L 5.1904297 6.850586 L 4.169922 6.850586 Q 3.6865234 6.850586 3.4985352 6.652832 Q 3.3105469 6.455078 3.3105469 5.9521484 L 3.3105469 5.46875 L 5.1904297 5.46875 L 5.1904297 4.770508 L 3.3105469 4.770508 L 3.3105469 0 L 2.4121094 0 L 2.4121094 4.770508 L 0.95214844 4.770508 L 0.95214844 5.46875 L 2.4121094 5.46875 L 2.4121094 5.8496094 Q 2.4121094 6.748047 2.824707 7.1728516 Q 3.2373047 7.5976563 4.111328 7.5976563 L 5.1904297 7.5976563 Z"/></symbol><symbol id=g961CAE06C7AAE8EB428417D81D5AEE72 overflow=visible><path d="M 3.1201172 1.9824219 Q 3.1201172 1.3769531 3.3422852 1.0693359 Q 3.5644531 0.76171875 3.9990234 0.76171875 L 5.048828 0.76171875 L 5.048828 0 L 3.9111328 0 Q 3.1054688 0 2.6635742 0.5175781 Q 2.2216797 1.0351563 2.2216797 1.9824219 L 2.2216797 6.948242 L 0.78125 6.948242 L 0.78125 7.651367 L 3.1201172 7.651367 L 3.1201172 1.9824219 Z"/></symbol><symbol id=g77AA3201A93C8F4113E19CCDA185B6F5 overflow=visible><path d="M 4.482422 2.7294922 Q 4.482422 3.774414 4.1503906 4.3066406 Q 3.8183594 4.838867 3.1689453 4.838867 Q 2.5146484 4.838867 2.1777344 4.304199 Q 1.8408203 3.7695313 1.8408203 2.7294922 Q 1.8408203 1.6943359 2.1777344 1.1572266 Q 2.5146484 0.6201172 3.1689453 0.6201172 Q 3.8183594 0.6201172 4.1503906 1.1523438 Q 4.482422 1.6845703 4.482422 2.7294922 Z M 1.8408203 4.770508 Q 2.055664 5.1708984 2.434082 5.385742 Q 2.8125 5.600586 3.3105469 5.600586 Q 4.296875 5.600586 4.8632813 4.8413086 Q 5.4296875 4.0820313 5.4296875 2.7490234 Q 5.4296875 1.3964844 4.86084 0.6274414 Q 4.291992 -0.14160156 3.3007813 -0.14160156 Q 2.8125 -0.14160156 2.4389648 0.07080078 Q 2.0654297 0.28320313 1.8408203 0.68847656 L 1.8408203 0 L 0.9423828 0 L 0.9423828 7.5976563 L 1.8408203 7.5976563 L 1.8408203 4.770508 Z"/></symbol><symbol id=g958F64BF87063D7EAFEDE953DDA2BF9F overflow=visible><path d="M 1.1523438 7.5976563 L 2.0800781 7.5976563 L 2.0800781 3.1982422 L 4.4384766 5.46875 L 5.5322266 5.46875 L 3.3789063 3.4082031 L 5.8691406 0 L 4.770508 0 L 2.7490234 2.8222656 L 2.0800781 2.1923828 L 2.0800781 0 L 1.1523438 0 L 1.1523438 7.5976563 Z"/></symbol><symbol id=gD3E02A90146443F5D1C908F343BC0F25 overflow=visible><path d="M 1.1445313 5.8320313 L 4.2148438 -0.7421875 L 3.4726563 -0.7421875 L 0.3984375 5.8320313 L 1.1445313 5.8320313 Z"/></symbol><symbol id=gC58E40CCEEAAE4A011790927FE560B0C overflow=visible><path d="M 3.8007813 4.2226563 L 3.8007813 3.5195313 Q 3.4921875 3.6992188 3.1796875 3.7890625 Q 2.8671875 3.8789063 2.5429688 3.8789063 Q 2.0546875 3.8789063 1.8144531 3.7207031 Q 1.5742188 3.5625 1.5742188 3.2382813 Q 1.5742188 2.9453125 1.7539063 2.8007813 Q 1.9335938 2.65625 2.6484375 2.5195313 L 2.9375 2.4648438 Q 3.4726563 2.3632813 3.7480469 2.0585938 Q 4.0234375 1.7539063 4.0234375 1.265625 Q 4.0234375 0.6171875 3.5625 0.25195313 Q 3.1015625 -0.11328125 2.28125 -0.11328125 Q 1.9570313 -0.11328125 1.6015625 -0.044921875 Q 1.2460938 0.0234375 0.83203125 0.16015625 L 0.83203125 0.90234375 Q 1.234375 0.6953125 1.6015625 0.5917969 Q 1.96875 0.48828125 2.296875 0.48828125 Q 2.7734375 0.48828125 3.0351563 0.6816406 Q 3.296875 0.875 3.296875 1.2226563 Q 3.296875 1.7226563 2.3398438 1.9140625 L 2.3085938 1.921875 L 2.0390625 1.9765625 Q 1.4179688 2.0976563 1.1328125 2.3847656 Q 0.84765625 2.671875 0.84765625 3.1679688 Q 0.84765625 3.796875 1.2734375 4.138672 Q 1.6992188 4.4804688 2.4882813 4.4804688 Q 2.8398438 4.4804688 3.1640625 4.4160156 Q 3.4882813 4.3515625 3.8007813 4.2226563 Z"/></symbol><symbol id=g3D5EE249F6894FA38DD21E85E2FD5F05 overflow=visible><path d="M 0 5.46875 L 0.8886719 5.46875 L 1.8408203 1.0498047 L 2.6220703 3.8720703 L 3.3886719 3.8720703 L 4.1796875 1.0498047 L 5.131836 5.46875 L 6.020508 5.46875 L 4.741211 0 L 3.881836 0 L 3.0078125 2.9980469 L 2.1386719 0 L 1.2792969 0 L 0 5.46875 Z"/></symbol><symbol id=gF953090ED8E474A6BDB5C112B8614419 overflow=visible><path d="M 3.953125 5.6328125 L 3.953125 4.8320313 Q 3.59375 5.0625 3.2324219 5.1796875 Q 2.8710938 5.296875 2.5039063 5.296875 Q 1.9453125 5.296875 1.6210938 5.0371094 Q 1.296875 4.7773438 1.296875 4.3359375 Q 1.296875 3.9492188 1.5097656 3.7460938 Q 1.7226563 3.5429688 2.3046875 3.40625 L 2.71875 3.3125 Q 3.5390625 3.1210938 3.9140625 2.7109375 Q 4.2890625 2.3007813 4.2890625 1.59375 Q 4.2890625 0.76171875 3.7734375 0.32421875 Q 3.2578125 -0.11328125 2.2734375 -0.11328125 Q 1.8632813 -0.11328125 1.4492188 -0.025390625 Q 1.0351563 0.0625 0.6171875 0.23828125 L 0.6171875 1.078125 Q 1.0664063 0.79296875 1.4667969 0.66015625 Q 1.8671875 0.52734375 2.2734375 0.52734375 Q 2.8710938 0.52734375 3.203125 0.7949219 Q 3.5351563 1.0625 3.5351563 1.5429688 Q 3.5351563 1.9804688 3.3066406 2.2109375 Q 3.078125 2.4414063 2.5117188 2.5664063 L 2.0898438 2.6640625 Q 1.2773438 2.8476563 0.91015625 3.21875 Q 0.54296875 3.5898438 0.54296875 4.2148438 Q 0.54296875 4.9960938 1.0683594 5.466797 Q 1.59375 5.9375 2.4648438 5.9375 Q 2.8007813 5.9375 3.171875 5.861328 Q 3.5429688 5.7851563 3.953125 5.6328125 Z"/></symbol><symbol id=gF5F7ADACD3C8648021D0891B6403D353 overflow=visible><path d="M 3.3515625 3.8164063 L 3.3515625 6.078125 L 4.0703125 6.078125 L 4.0703125 0 L 3.3515625 0 L 3.3515625 0.55078125 Q 3.171875 0.2265625 2.8730469 0.056640625 Q 2.5742188 -0.11328125 2.1835938 -0.11328125 Q 1.390625 -0.11328125 0.9355469 0.5019531 Q 0.48046875 1.1171875 0.48046875 2.1992188 Q 0.48046875 3.265625 0.9375 3.8730469 Q 1.3945313 4.4804688 2.1835938 4.4804688 Q 2.578125 4.4804688 2.8789063 4.310547 Q 3.1796875 4.140625 3.3515625 3.8164063 Z M 1.2382813 2.1835938 Q 1.2382813 1.3476563 1.5039063 0.921875 Q 1.7695313 0.49609375 2.2890625 0.49609375 Q 2.8085938 0.49609375 3.0800781 0.92578125 Q 3.3515625 1.3554688 3.3515625 2.1835938 Q 3.3515625 3.015625 3.0800781 3.4433594 Q 2.8085938 3.8710938 2.2890625 3.8710938 Q 1.7695313 3.8710938 1.5039063 3.4453125 Q 1.2382813 3.0195313 1.2382813 2.1835938 Z"/></symbol><symbol id=g3402EB21D38B9A8AFC4DFC6262792511 overflow=visible><path d="M 4.189453 4.770508 L 4.189453 7.5976563 L 5.0878906 7.5976563 L 5.0878906 0 L 4.189453 0 L 4.189453 0.68847656 Q 3.9648438 0.28320313 3.5913086 0.07080078 Q 3.2177734 -0.14160156 2.7294922 -0.14160156 Q 1.7382813 -0.14160156 1.1694336 0.6274414 Q 0.60058594 1.3964844 0.60058594 2.7490234 Q 0.60058594 4.0820313 1.171875 4.8413086 Q 1.7431641 5.600586 2.7294922 5.600586 Q 3.2226563 5.600586 3.5986328 5.3881836 Q 3.9746094 5.1757813 4.189453 4.770508 Z M 1.5478516 2.7294922 Q 1.5478516 1.6845703 1.8798828 1.1523438 Q 2.211914 0.6201172 2.8613281 0.6201172 Q 3.5107422 0.6201172 3.8500977 1.1572266 Q 4.189453 1.6943359 4.189453 2.7294922 Q 4.189453 3.7695313 3.8500977 4.304199 Q 3.5107422 4.838867 2.8613281 4.838867 Q 2.211914 4.838867 1.8798828 4.3066406 Q 1.5478516 3.774414 1.5478516 2.7294922 Z"/></symbol><symbol id=g9E9C649267338B7BCF3BB51B9816396A overflow=visible><path d="M 4.189453 2.7783203 Q 4.189453 3.7890625 3.8598633 4.313965 Q 3.5302734 4.838867 2.9003906 4.838867 Q 2.241211 4.838867 1.8945313 4.313965 Q 1.5478516 3.7890625 1.5478516 2.7783203 Q 1.5478516 1.7675781 1.8969727 1.237793 Q 2.2460938 0.7080078 2.9101563 0.7080078 Q 3.5302734 0.7080078 3.8598633 1.2402344 Q 4.189453 1.7724609 4.189453 2.7783203 Z M 5.0878906 0.3515625 Q 5.0878906 -0.87890625 4.506836 -1.5136719 Q 3.9257813 -2.1484375 2.7978516 -2.1484375 Q 2.4267578 -2.1484375 2.0214844 -2.0800781 Q 1.6162109 -2.0117188 1.2109375 -1.8798828 L 1.2109375 -0.99121094 Q 1.6894531 -1.2158203 2.0800781 -1.3232422 Q 2.4707031 -1.4306641 2.7978516 -1.4306641 Q 3.5253906 -1.4306641 3.8574219 -1.0351563 Q 4.189453 -0.63964844 4.189453 0.21972656 L 4.189453 0.25878906 L 4.189453 0.8691406 Q 3.9746094 0.41015625 3.6035156 0.18554688 Q 3.2324219 -0.0390625 2.7001953 -0.0390625 Q 1.7431641 -0.0390625 1.171875 0.72753906 Q 0.60058594 1.4941406 0.60058594 2.7783203 Q 0.60058594 4.067383 1.171875 4.8339844 Q 1.7431641 5.600586 2.7001953 5.600586 Q 3.227539 5.600586 3.59375 5.390625 Q 3.959961 5.180664 4.189453 4.741211 L 4.189453 5.4492188 L 5.0878906 5.4492188 L 5.0878906 0.3515625 Z"/></symbol><symbol id=gB83FD8DF61FB2E4EAD552878F3E8DD3F overflow=visible><path d="M 3.3007813 4.9121094 Q 3.4667969 5.263672 3.7231445 5.432129 Q 3.9794922 5.600586 4.3408203 5.600586 Q 5 5.600586 5.270996 5.090332 Q 5.541992 4.580078 5.541992 3.1689453 L 5.541992 0 L 4.7216797 0 L 4.7216797 3.1298828 Q 4.7216797 4.2871094 4.592285 4.567871 Q 4.4628906 4.848633 4.1210938 4.848633 Q 3.7304688 4.848633 3.5864258 4.54834 Q 3.4423828 4.248047 3.4423828 3.1298828 L 3.4423828 0 L 2.6220703 0 L 2.6220703 3.1298828 Q 2.6220703 4.301758 2.4829102 4.5751953 Q 2.34375 4.848633 1.9824219 4.848633 Q 1.6259766 4.848633 1.4868164 4.54834 Q 1.3476563 4.248047 1.3476563 3.1298828 L 1.3476563 0 L 0.53222656 0 L 0.53222656 5.46875 L 1.3476563 5.46875 L 1.3476563 5 Q 1.5087891 5.2929688 1.7504883 5.4467773 Q 1.9921875 5.600586 2.2998047 5.600586 Q 2.6708984 5.600586 2.9174805 5.4296875 Q 3.1640625 5.258789 3.3007813 4.9121094 Z"/></symbol><symbol id=g807B89443FA0EF4D7A7A613982FE96F6 overflow=visible><path d="M 2.3583984 3.6621094 Q 2.3583984 3.930664 2.5463867 4.1259766 Q 2.734375 4.321289 2.9980469 4.321289 Q 3.2714844 4.321289 3.4667969 4.1259766 Q 3.6621094 3.930664 3.6621094 3.6621094 Q 3.6621094 3.3886719 3.4692383 3.1982422 Q 3.2763672 3.0078125 2.9980469 3.0078125 Q 2.7246094 3.0078125 2.541504 3.1933594 Q 2.3583984 3.3789063 2.3583984 3.6621094 Z M 3.0078125 6.640625 Q 2.319336 6.640625 1.9799805 5.8984375 Q 1.640625 5.15625 1.640625 3.6376953 Q 1.640625 2.1240234 1.9799805 1.3818359 Q 2.319336 0.63964844 3.0078125 0.63964844 Q 3.7011719 0.63964844 4.0405273 1.3818359 Q 4.379883 2.1240234 4.379883 3.6376953 Q 4.379883 5.15625 4.0405273 5.8984375 Q 3.7011719 6.640625 3.0078125 6.640625 Z M 3.0078125 7.421875 Q 4.1748047 7.421875 4.772949 6.4648438 Q 5.3710938 5.5078125 5.3710938 3.6376953 Q 5.3710938 1.7724609 4.772949 0.8154297 Q 4.1748047 -0.14160156 3.0078125 -0.14160156 Q 1.8408203 -0.14160156 1.2451172 0.8154297 Q 0.64941406 1.7724609 0.64941406 3.6376953 Q 0.64941406 5.5078125 1.2451172 6.4648438 Q 1.8408203 7.421875 3.0078125 7.421875 Z"/></symbol><symbol id=gA06F636B71996BA7070F256843DCE7EE overflow=visible><path d="M 2.9101563 3.2324219 Q 3.540039 3.2324219 3.8989258 3.6865234 Q 4.2578125 4.140625 4.2578125 4.9414063 Q 4.2578125 5.7421875 3.8989258 6.196289 Q 3.540039 6.6503906 2.9101563 6.6503906 Q 2.2558594 6.6503906 1.9238281 6.2182617 Q 1.5917969 5.786133 1.5917969 4.9414063 Q 1.5917969 4.091797 1.9213867 3.6621094 Q 2.2509766 3.2324219 2.9101563 3.2324219 Z M 1.1523438 0.15136719 L 1.1523438 1.0595703 Q 1.4599609 0.87890625 1.8066406 0.7836914 Q 2.1533203 0.68847656 2.5292969 0.68847656 Q 3.4667969 0.68847656 3.947754 1.394043 Q 4.428711 2.0996094 4.428711 3.4716797 Q 4.1992188 2.9833984 3.7841797 2.722168 Q 3.3691406 2.4609375 2.8320313 2.4609375 Q 1.7773438 2.4609375 1.1987305 3.1103516 Q 0.6201172 3.7597656 0.6201172 4.951172 Q 0.6201172 6.1279297 1.2133789 6.7749023 Q 1.8066406 7.421875 2.890625 7.421875 Q 4.1601563 7.421875 4.7509766 6.508789 Q 5.341797 5.595703 5.341797 3.6376953 Q 5.341797 1.796875 4.6313477 0.8276367 Q 3.9208984 -0.14160156 2.5683594 -0.14160156 Q 2.211914 -0.14160156 1.8505859 -0.06591797 Q 1.4892578 0.009765625 1.1523438 0.15136719 Z"/></symbol><symbol id=g27C321132E0A6A9E6B99ED77584BAD53 overflow=visible><path d="M 1.703125 0.6484375 Q 2.6992188 0.6484375 3.09375 1.1386719 Q 3.4882813 1.6289063 3.4882813 2.9101563 Q 3.4882813 4.203125 3.0957031 4.6933594 Q 2.703125 5.1835938 1.703125 5.1835938 L 1.328125 5.1835938 L 1.328125 0.6484375 L 1.703125 0.6484375 Z M 1.71875 5.8320313 Q 3.0546875 5.8320313 3.6875 5.1210938 Q 4.3203125 4.4101563 4.3203125 2.9101563 Q 4.3203125 1.4179688 3.6875 0.7089844 Q 3.0546875 0 1.71875 0 L 0.53515625 0 L 0.53515625 5.8320313 L 1.71875 5.8320313 Z"/></symbol><symbol id=g7342E383B6C704BD4B47D4672216B35D overflow=visible><path d="M 0 4.375 L 0.7109375 4.375 L 1.4726563 0.83984375 L 2.0976563 3.0976563 L 2.7109375 3.0976563 L 3.34375 0.83984375 L 4.1054688 4.375 L 4.8164063 4.375 L 3.7929688 0 L 3.1054688 0 L 2.40625 2.3984375 L 1.7109375 0 L 1.0234375 0 L 0 4.375 Z"/></symbol><symbol id=gC5F336A8E4AF2A41DBA4980BEB90D9CD overflow=visible><path d="M 2.4511719 1.4794922 L 3.6816406 1.4794922 L 3.6816406 0.46875 L 2.7197266 -1.4013672 L 1.9677734 -1.4013672 L 2.4511719 0.46875 L 2.4511719 1.4794922 Z"/></symbol><symbol id=g952AB916CC2FCD530DE73925A36C7F0D overflow=visible><path d="M 0.95214844 2.0703125 L 0.95214844 5.4589844 L 1.8505859 5.4589844 L 1.8505859 2.0703125 Q 1.8505859 1.3330078 2.1118164 0.9863281 Q 2.3730469 0.63964844 2.9199219 0.63964844 Q 3.5546875 0.63964844 3.8916016 1.0864258 Q 4.2285156 1.5332031 4.2285156 2.368164 L 4.2285156 5.4589844 L 5.131836 5.4589844 L 5.131836 0 L 4.2285156 0 L 4.2285156 0.8203125 Q 3.9892578 0.3466797 3.5766602 0.10253906 Q 3.1640625 -0.14160156 2.6123047 -0.14160156 Q 1.7724609 -0.14160156 1.3623047 0.40771484 Q 0.95214844 0.95703125 0.95214844 2.0703125 Z"/></symbol><symbol id=g9A4F7CA79966390D26B2F6FED68DC851 overflow=visible><path d="M 0 5.8320313 L 0.76953125 5.8320313 L 1.328125 1.0976563 L 1.9921875 4.2304688 L 2.8164063 4.2304688 L 3.4882813 1.0898438 L 4.046875 5.8320313 L 4.8164063 5.8320313 L 3.9453125 0 L 3.1992188 0 L 2.40625 3.4648438 L 1.6171875 0 L 0.87109375 0 L 0 5.8320313 Z"/></symbol></defs></svg></div><div><p><br><span style=text-decoration:underline><h4>Anchors</h4></span> <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>^</span></code></span> is used to assert the beginning of a line in multi-line mode, or the beginning of the string in whole-string mode.<p><span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>$</span></code></span> is used to assert the end of a line in multi-line mode, or the end of the string in whole-string mode.<p>The behaviours of these depend on the <a href=#match-options>match options</a></div><div><p><br><span id=greedy style=text-decoration:underline><h3>Greedy VS Lazy</h3></span> Some combinators will either match “lazy”, or “greedy”.<p>Lazy is when the engine only matches as many characters required to get to the next step. This should almost always be used.<p>Greedy matching is when the engine tries to match as many characters as possible. The problem with this is that it might cause “backtracking”, which happens when the engine goes back in the pattern multiple times to ensure that as many characters as possible where matched. This can cause big performance issues.</div><div><br><span style=text-decoration:underline><h3>Combinators</h3></span> Multiple atoms can be combined together to form more complex patterns.</div><div><p><br><span style=text-decoration:underline><h4>Chain</h4></span> When two expressions are next to each other, they will be chained together, which means that both will be evaluated in-order.<p>Example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>x<span style=color:#d73a49>\d</span></code></span> matches a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>x</code></span> and then a digit, like for example <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>x9</code></span></div><div><p><br><span style=text-decoration:underline><h4>Or</h4></span> Two expressions separated by a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>|</code></span> cause the RegEx engine to first try to match the left side, and only if it fails, it tries the right side instead.<p>Note that “or” has a long left and right scope, which means that <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>ab<span style=color:#d73a49>|</span>cd</code></span> will match either <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>ab</code></span> or <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>cd</code></span></div><div><p><br><span style=text-decoration:underline><h4>Or-Not</h4></span> Tries to match the expression on the left to it, but won’t error if it doesn’t succeed.<p>Note that “or-not” has a short left scope, which means that <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>ab<span style=color:#d73a49>?</span></code></span> will always match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>, and then try to match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>b</code></span></div><div><p><br><span style=text-decoration:underline><h4>Repeated</h4></span> A expression followed by either a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>*</code></span> for <a href=#greedy>greedy</a> repeat, or a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>*?</code></span> for <a href=#greedy>lazy</a> repeat.<p>This matches as many times as possible, but can also match the pattern zero times.<p>Note that this has a short left scope.</div><div><p><br><span style=text-decoration:underline><h4>Repeated At Least Once</h4></span> A expression followed by either a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>+</code></span> for <a href=#greedy>greedy</a> repeat, or a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>+?</code></span> for <a href=#greedy>lazy</a> repeat.<p>This matches as many times as possible, and at least one time.<p>Note that this has a short left scope.</div><div><p><br><span id=non-capture-group style=text-decoration:underline><h4>(Non-Capture) Group</h4></span> Groups multiple expressions together for scoping.<p>Example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>(</span><span style=color:#b60157>?:</span>abc<span style=color:#d73a49>)</span></code></span> will just match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>abc</code></span></div><div><p><br><span style=text-decoration:underline><h4>Capture Group</h4></span> Similar to <a href=#non-capture-group>Non-Capture Groups</a> except that they capture the matched text. This allows the matched text of the inner expression to be extracted later.<p>Capture group IDs are enumerated from left to right, starting with 1.<p>Example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>(</span>abc<span style=color:#d73a49>)</span>de</code></span> will match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>abcde</code></span>, and store <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>abc</code></span> in group 1.</div><div><p><br><span style=text-decoration:underline><h4>Character Set</h4></span> By surrounding multiple characters in square brackets, the engine will match any of them. Special characters or expressions won’t be parsed inside them, which means that this can also be used to escape characters.<p>For example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>[</span>abc<span style=color:#d73a49>]</span></code></span> will match either <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>b</code></span> or <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>c</code></span>.<p>and <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>[</span>ab(?:c)<span style=color:#d73a49>]</span></code></span> will match either <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>b</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>(</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>?</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>:</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>c</code></span>, or <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>)</code></span>.<p><a href=#char-groups>Character groups</a> and <a href=#escaped-chars>escaped characters</a> still work inside character sets.<p>Character sets can also contain ranges. For example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>[</span><span style=color:#b60157>0</span><span style=color:#b60157>-9</span><span style=color:#b60157>a</span><span style=color:#b60157>-z</span><span style=color:#d73a49>]</span></code></span> will match either any digit, or any lowercase letter.</div><div><p><br><span style=text-decoration:underline><h2>Conclusion</h2></span> RegEx is perfect for when you just want to match some patterns, but the syntax can make patterns very hard to read or modify.<p>In the next article, we will start to dive into implementing RegEx.<p>Stay tuned!</div><script>var gotoVariant=(a=>{window.location.href=window.location.href.replace(/\.\w+.html/g,a)});window.addEventListener(`beforeprint`,a=>{gotoVariant(`.min.pdf`)})</script><script async src=coffee.js></script> |