feat(parser): support // separator and dot-compressed names #208

Merged
marcel merged 3 commits from feat/issue-190-slash-separator-dot-compressed into main 2026-04-08 18:46:53 +02:00
2 changed files with 41 additions and 0 deletions
Showing only changes of commit 0b57717586 - Show all commits

View File

@@ -123,6 +123,11 @@ public class PersonNameParser {
String cleaned = GEB_PATTERN.matcher(rawName).replaceAll("").trim();
// Normalize dot-compressed names: "Dr.Fr.Zarncke" -> "Dr. Fr. Zarncke"
if (!cleaned.contains(" ") && cleaned.contains(".")) {
cleaned = cleaned.replace(".", ". ").trim();
}
String lastName = findKnownLastName(cleaned);
if (lastName != null) {
String firstName = cleaned.substring(0, cleaned.length() - lastName.length()).trim();

View File

@@ -133,6 +133,42 @@ class PersonNameParserTest {
assertThat(result.lastName()).isEqualTo("de Gruyter");
}
// --- split — dot-compressed names ---
@Test
void split_dotCompressed_initialAndLastName() {
PersonNameParser.SplitName result = PersonNameParser.split("E.Rockstroh");
assertThat(result.firstName()).isEqualTo("E.");
assertThat(result.lastName()).isEqualTo("Rockstroh");
}
@Test
void split_dotCompressed_twoInitials() {
PersonNameParser.SplitName result = PersonNameParser.split("E.M.");
assertThat(result.firstName()).isEqualTo("E.");
assertThat(result.lastName()).isEqualTo("M.");
}
@Test
void split_dotCompressed_titleFirstNameLastName() {
PersonNameParser.SplitName result = PersonNameParser.split("Dr.Fr.Zarncke");
assertThat(result.firstName()).isEqualTo("Dr. Fr.");
assertThat(result.lastName()).isEqualTo("Zarncke");
}
@Test
void split_dotCompressed_titleAndLastName() {
PersonNameParser.SplitName result = PersonNameParser.split("Dr.Zarnke");
assertThat(result.firstName()).isEqualTo("Dr.");
assertThat(result.lastName()).isEqualTo("Zarnke");
}
@Test
void parseReceivers_dotCompressedName_passthrough() {
assertThat(PersonNameParser.parseReceivers("Dr.Fr.Zarncke"))
.containsExactly("Dr.Fr.Zarncke");
}
// --- parseReceivers — shared last name with full-name part ─────────────────
@Test