簡體   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