using System.Text.RegularExpressions;
using System.Collections.Generic;
public static void Main()
Console.WriteLine("=== Icelandic Date Parser Test ===\n");
"Umferðarslys 19.ágúst 2024",
"Umferðarslys 07.sept.2020",
"Frítímaslys 14. nóvember 2024",
"Sjúklingatryggingaatburður 14.11.2025",
"Umferðarslys 13.5.2024",
"Vinnuslys þann 8. desember 2024",
"Sjúklingatryggingaratvik í kjölfar frítímaslyss 21. mars 2025",
"Frítímaslys 30.12.2024",
"Læknamistök 13-15. febrúar 2025",
"Læknamistök 13 til 15. febrúar 2025",
"Umferðarslys 25. apríl 2024",
"Vinnuslys 17.sept.2022",
"Sjúklingatryggingaratburður janúar 2021 til janúar 2023",
"Frítímaslys 14.nóv.2024",
"Umferðarslys 07.sep.2020",
"Almenn sjúklingatrygging"
foreach (var testCase in testCases)
var result = IcelandicDateParser.ExtractDateFromProjectName(testCase);
Console.WriteLine($"Input: {testCase}");
Console.WriteLine($"Result: {(result?.ToString("yyyy-MM-dd") ?? "null")}");
Console.WriteLine("=== Expected Results Validation ===");
ValidateTest("Umferðarslys 19.ágúst 2024", new DateTime(2024, 8, 19));
ValidateTest("Læknamistök 13-15. febrúar 2025", new DateTime(2025, 2, 13));
ValidateTest("Sjúklingatryggingaratburður janúar 2021 til janúar 2023", new DateTime(2021, 1, 1));
ValidateTest("Vinnuslys 17.des.2022", new DateTime(2022, 12, 17));
ValidateTest("Almenn sjúklingatrygging", null);
private static void ValidateTest(string input, DateTime? expected)
var result = IcelandicDateParser.ExtractDateFromProjectName(input);
bool isCorrect = (result == expected);
string status = isCorrect ? "✓ PASS" : "✗ FAIL";
Console.WriteLine($"{status} - {input}");
Console.WriteLine($" Expected: {expected?.ToString("yyyy-MM-dd") ?? "null"}");
Console.WriteLine($" Got: {result?.ToString("yyyy-MM-dd") ?? "null"}");
public static class IcelandicDateParser
private static readonly Dictionary<string, int> IcelandicMonths = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
public static DateTime? ExtractDateFromProjectName(string projectName)
if (string.IsNullOrWhiteSpace(projectName))
var pattern3 = @"(\d{1,2})-(\d{1,2})\.\s*(\w+)\s+(\d{4})";
var match3 = Regex.Match(projectName, pattern3);
if (int.TryParse(match3.Groups[1].Value, out int day) &&
int.TryParse(match3.Groups[4].Value, out int year))
int month = GetMonthNumber(match3.Groups[3].Value);
return new DateTime(year, month, day);
catch (ArgumentOutOfRangeException)
var pattern4 = @"(\d{1,2})\s+til\s+(\d{1,2})\.\s*(\w+)\s+(\d{4})";
var match4 = Regex.Match(projectName, pattern4);
if (int.TryParse(match4.Groups[1].Value, out int day) &&
int.TryParse(match4.Groups[4].Value, out int year))
int month = GetMonthNumber(match4.Groups[3].Value);
return new DateTime(year, month, day);
catch (ArgumentOutOfRangeException)
var pattern5 = @"(\w+)\s+(\d{4})\s+til\s+\w+\s+\d{4}";
var match5 = Regex.Match(projectName, pattern5);
if (int.TryParse(match5.Groups[2].Value, out int year))
int month = GetMonthNumber(match5.Groups[1].Value);
return new DateTime(year, month, 1);
catch (ArgumentOutOfRangeException)
var pattern1 = @"(\d{1,2})\.(\w+)\.?(\d{4})";
var match1 = Regex.Match(projectName, pattern1);
if (int.TryParse(match1.Groups[1].Value, out int day) &&
int.TryParse(match1.Groups[3].Value, out int year))
string monthStr = match1.Groups[2].Value.TrimEnd('.');
int month = GetMonthNumber(monthStr);
return new DateTime(year, month, day);
catch (ArgumentOutOfRangeException)
var pattern2 = @"(\d{1,2})\.\s*(\w+)\s+(\d{4})";
var match2 = Regex.Match(projectName, pattern2);
if (int.TryParse(match2.Groups[1].Value, out int day) &&
int.TryParse(match2.Groups[3].Value, out int year))
int month = GetMonthNumber(match2.Groups[2].Value);
return new DateTime(year, month, day);
catch (ArgumentOutOfRangeException)
var pattern6 = @"(\w+)\s+(\d{4})";
var match6 = Regex.Match(projectName, pattern6);
if (int.TryParse(match6.Groups[2].Value, out int year))
int month = GetMonthNumber(match6.Groups[1].Value);
return new DateTime(year, month, 1);
catch (ArgumentOutOfRangeException)
private static int GetMonthNumber(string monthString)
if (int.TryParse(monthString, out int monthNum) && monthNum >= 1 && monthNum <= 12)
if (IcelandicMonths.TryGetValue(monthString, out int month))