^start of string
Group LastName(?<LastName>\w+(?:[-' ]*\w+)*) \w+any word character, repeated at least once
Non-Capturing Group(?:[-' ]*\w+)* *repeats the group contents below any number of times:
*matches any number of characters from the set below:
-the literal - (4510 / 558 / 2D16)
'the literal ' (3910 / 478 / 2716)
the literal (3210 / 408 / 2016)
\w+any word character, repeated at least once
,the literal , (4410 / 548 / 2C16)
\s?optionally matches any whitespace character
Group FirstName(?<FirstName>\w[-']?(?:[-']?\w+[']?)*) \wany word character
?matches at most one character from the set below:
-the literal - (4510 / 558 / 2D16)
'the literal ' (3910 / 478 / 2716)
Non-Capturing Group(?:[-']?\w+[']?)* *repeats the group contents below any number of times:
?matches at most one character from the set below:
-the literal - (4510 / 558 / 2D16)
'the literal ' (3910 / 478 / 2716)
\w+any word character, repeated at least once
?matches at most one character from the set below:
'the literal ' (3910 / 478 / 2716)
?matches at most one character from the set below:
.the literal . (4610 / 568 / 2E16)
\s?optionally matches any whitespace character
Group MiddleName(?<MiddleName>\w+)? ?repeats the group contents below at most once:
\w+any word character, repeated at least once
$end of string, or before its final line terminator
g modifier: global. Finds all matches instead of stopping after the first