^start of line
Group localpart(?<localpart>[^-].*[^-]) Negated Character Class[^-] -the literal - (4510 / 558 / 2D16)
.*any character (except for line terminators), repeated any number of times
Negated Character Class[^-] -the literal - (4510 / 558 / 2D16)
@the literal @ (6410 / 1008 / 4016)
Group domainpart(?<domainpart>[^-].*[^-]) Negated Character Class[^-] -the literal - (4510 / 558 / 2D16)
.*any character (except for line terminators), repeated any number of times
Negated Character Class[^-] -the literal - (4510 / 558 / 2D16)
\.the literal . (4610 / 568 / 2E16)
.{2,3}any character (except for line terminators), repeated between 2 and 3 times
$end of line
g modifier: global. Finds all matches instead of stopping after the first
m modifier: multiline. Causes ^ and $ to match the start and end of each line, not only the start and end of the string