使用 Regex.Replace 将单词组合中的第二个匹配项小写

Lowercase the second match in a combination of words using Regex.Replace

在设置一个人的姓氏时(我知道这是一项糟糕的工作),我希望将以下任何单词的组合中的第二个匹配项小写: Van、Den、Der、In、de、het。 如果在“-”(组合姓氏)之后再次发生,请重复此模式。

想要的结果:
范登布鲁克 => 范登布鲁克
Derksen-van 't Schip => Derksen-Van 't Schip
In Het Lid-Van De Boer => In het Lid-Van de Boer

我尝试使用下面的代码将 ' 之后的首字母大写和小写。然而,使用正则表达式创建上述结果对我来说仍然是一个很远的桥梁。

var formattedLastName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lastName); 
formattedLastName = Regex.Replace(formattedLastName, @"('\w\b)", (Match match) => match.ToString().ToLower());

您可以使用

实现预期的输出
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;

public class Test
{
    public static void Main()
    {
        var strings = new List<string> { "Van Den Broek", "Derksen-van 't schip", "In Het Lid-Van De Boer"};
        var textInfo = new CultureInfo("en-US", false).TextInfo;
        var pattern = new Regex(@"\b(Van|Den|Der|In|de|het)\b(?:\s+(\w+))?", RegexOptions.Compiled|RegexOptions.IgnoreCase);
        foreach (var s in strings)
            Console.WriteLine(pattern.Replace(s, m => textInfo.ToTitleCase(m.Groups[1].Value) + 
               (m.Groups[2].Success ? $" {m.Groups[2].Value.ToLower()}" : "")));
    }
}

看到online demo yiedling

Van den Broek
Derksen-Van 't schip
In het Lid-Van de Boer

\b(Van|Den|Der|In|de|het)\b(?:\s+(\w+))? 正则表达式匹配来自 VanDenDerInde 和 [=18 的单词=] list 将其捕获到第 1 组,然后是一个或多个白色 space 的可选序列,然后是捕获到第 2 组的任何单词。

匹配被第 1 组替换为标题大小写(注意 System.Globalization.ToTitleCase 的使用),如果第 2 组匹配,space 和第 2 组值变为小写。