[英]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.