【问题标题】:Lowercase the second match in a combination of words using Regex.Replace使用 Regex.Replace 将单词组合中的第二个匹配小写
【发布时间】:2022-01-03 16:37:26
【问题描述】:

在设置一个人的姓氏时(我知道这是一项糟糕的工作),我希望将以下任何单词组合成小写第二个匹配项: 范,登,德,在,德,het。 如果在 '-'(组合的姓氏)之后再次发生,则重复此模式。

想要的结果:
范登布鲁克 => 范登布鲁克
Derksen-van 't Schip => Derksen-Van't Schip
在 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());

【问题讨论】:

  • 您的第二个示例与您的问题标题和您的一般描述不符。
  • 你有名单吗?如果您想匹配 In Het Lid 更改为 In het Lid 您必须先匹配它。但是你怎么知道这是不是一个名字,而In het holst van de nacht不是一个名字呢?
  • 谢谢第四只鸟。这是一个名为 lastnames 的(自定义)人员实体的属性,所以我知道人们会输入他们的姓氏。

标签: c# regex uppercase lowercase


【解决方案1】:

您可以使用

实现您的预​​期输出
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 demoyiedling

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 组值转换为小写。

【讨论】:

  • RegexOptions.Compiled|RegexOptions.IgnoreCase 这部分到底是做什么的?这是否意味着编译第一种情况,忽略第二种情况?
  • 不,它正在将正则表达式编译成正则表达式对象并使搜索不区分大小写。
  • 情况似乎发生了一些变化。如果所有中缀(Van、de het、een、der 等)都是小写的,除非它以其中一个单词开头,否则您将如何解决它。撇号之前或之后的单个字符是小写的 所以对于上面的例子 van den Broek => Van den Broek, Derksen-Van 'T Schip => Derksen-van 't Schip In het Lid-Van De Boer => In het lid -van de boer, 'T Gilde => 't Gilde, Cramen-L'amie => Cramen-l'Amie, Van den L'isle => Van den l'Isle, Jansen-D'ancona => Jansen-d 'Ancona Ebboubola N'na => Eboubola n'Na
  • @TimHage 对不起,这不再清楚了。 lid 不在您的列表中。
  • @TimHage 如果不考虑lid,可以使用this regexthis C# code
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多