[英]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+))?
正則表達式匹配Van
、 Den
、 Der
、 In
、 de
和het
列表中的一個單詞,將其捕獲到第 1 組中,然后匹配一個或多個空格的可選序列,然后將任何單詞捕獲到第 2 組中。
匹配被替換為第 1 組變成標題大小寫(注意使用System.Globalization.ToTitleCase
),如果第 2 組匹配,則空格和第 2 組值變成小寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.