parseHumanName function

HumanNameParserUtils parseHumanName(
  1. String full
)

Simple split: "Last, First Middle" or "First Middle Last". Suffix: Jr., Sr., III, etc.

Implementation

HumanNameParserUtils parseHumanName(String full) {
  final String s = full.trim();
  if (s.isEmpty) return const HumanNameParserUtils();
  final RegExp suffixRe = RegExp(r',?\s+(Jr\.?|Sr\.?|III?|IV|II|I)$', caseSensitive: false);
  final String? suffix = suffixRe.firstMatch(s)?.group(1);
  String rest = s.replaceAll(suffixRe, '').trim();
  if (rest.contains(',')) {
    final List<String> parts = rest.split(',').map((e) => e.trim()).toList();
    if (parts.length >= 2) {
      return HumanNameParserUtils(
        last: parts[0],
        first: parts[1],
        middle: parts.length > 2 ? parts[2] : null,
        suffix: suffix,
      );
    }
  }
  final List<String> tokens = rest.split(RegExp(r'\s+'));
  if (tokens.isEmpty) return HumanNameParserUtils(suffix: suffix);
  if (tokens.length == 1) return HumanNameParserUtils(first: tokens[0], suffix: suffix);
  return HumanNameParserUtils(
    first: tokens[0],
    last: tokens[tokens.length - 1],
    middle: tokens.length > 2 ? tokens.sublist(1, tokens.length - 1).join(' ') : null,
    suffix: suffix,
  );
}