fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using System.Globalization;
  6.  
  7. public class Test
  8. {
  9. public static string Replacer(Match m, TextInfo ti) {
  10. if (m.Groups[2].Success) { // the word to be lowercased is matched
  11. if (!m.Groups[1].Success) { // if it is not at the start of a string
  12. return m.Groups[2].Value.ToLower(); // lowercase
  13. } else {
  14. return ti.ToTitleCase(m.Groups[2].Value);
  15. }
  16. } else if (m.Groups[3].Success) { // abc'n matched
  17. return $"{ti.ToTitleCase(m.Groups[3].Value)}'{m.Groups[4].Value.ToLower()}";
  18. } else if (m.Groups[5].Success) { // n'abc matched
  19. return $"{m.Groups[5].Value.ToLower()}'{ti.ToTitleCase(m.Groups[6].Value)}";
  20. }
  21. return m.Value;
  22. }
  23.  
  24. public static void Main()
  25. {
  26. var strings = new List<string> { "Van Den Broek", "Derksen-van 't schip", "In Het Lid-Van De Boer",
  27. "van den Broek", "Derksen-Van 'T Schip", "In het Lid-Van De Boer", "'T Gilde", "Cramen-L'amie",
  28. "Van den L'isle", "Jansen-D'ancona", "Ebboubola N'na"};
  29. // van den Broek => Van den Broek, Derksen-Van 'T Schip => Derksen-van 't Schip In het Lid-Van De Boer => In het lid-van de boer, 'T Gilde => 't Gilde, Cramen-L'amie => Cramen-l'Amie, Van den L'isle => Van den l'Isle, Jansen-D'ancona => Jansen-d'Ancona Ebboubola N'na => Eboubola n'Na
  30. var textInfo = new CultureInfo("en-US", false).TextInfo;
  31. var p = @"(?:(^)|\b)(van|de[rn]?|In|het)\b|(\p{L}*)'(\p{L})\b|\b(\p{L})'(\p{L}*)";
  32. var pattern = new Regex(p, RegexOptions.Compiled|RegexOptions.IgnoreCase);
  33. foreach (var s in strings)
  34. Console.WriteLine(pattern.Replace(s, m => Replacer(m, textInfo)));
  35. }
  36. }
Success #stdin #stdout 0.12s 29008KB
stdin
Standard input is empty
stdout
Van den Broek
Derksen-van 't schip
In het Lid-van de Boer
Van den Broek
Derksen-van 't Schip
In het Lid-van de Boer
't Gilde
Cramen-l'Amie
Van den l'Isle
Jansen-d'Ancona
Ebboubola n'Na