繁体   English   中英

使用 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 => 在 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()}" : "")));
    }
}

查看在线演示

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

\b(Van|Den|Der|In|de|het)\b(?:\s+(\w+))? 正则表达式匹配VanDenDerIndehet列表中的一个单词,将其捕获到第 1 组中,然后匹配一个或多个空格的可选序列,然后将任何单词捕获到第 2 组中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM