如何将一组单个字符和空格替换为相同的字符但没有空格

本文关键字:空格 字符 替换 一组 单个 | 更新日期: 2023-09-27 18:37:28

我正在尝试标准化C#中某些作者姓名的格式。棘手的是那些使用首字母的人。例如,流行的哈利波特系列的作者可能是以下任何一个:

  • JK罗琳
  • J.K.罗琳
  • J.K.罗琳
  • J K 罗琳

我想将所有这些标准化为"JK罗琳"。

我也在尝试解决像JRR Tolkien这样的名字,那里有三个首字母而不是两个。

在轻松替换"."之后,我只剩下"J K 罗琳"或"J R R Tolkien"。我想将它们转换为"JK罗琳"和"JRR托尔金"。

所以逻辑是:捕获单个字符,后跟任意数量的空格,然后后跟但不包括另一个字符。从捕获中删除空格,并将捕获替换为清理的字符串。

下面是一些示例:

    J R R 托尔
  • 金 --> JRR 托尔金
  • E L James --> EL James
  • F 斯科特·菲茨杰拉德 --> 没有变化

我已经到了能够捕捉我需要的角色的地步:

('b[a-zA-Z]'b's*)*

https://www.debuggex.com/r/OLnu3YvvjIumGbQ1

但是我不确定从这里开始,以便用没有任何空格的版本替换捕获。

如何将一组单个字符和空格替换为相同的字符但没有空格

尝试替换

'b('w)'.?'s*(?!'w'w)

$1.

正则表达式101演示。

使用此正则表达式,然后将匹配项替换为空字符串。

@"(?<='b[A-Z])[.'s]+(?=[A-Z]'b)|(?<='b[A-Z])'.(?='s[A-Z])"

演示

Regex.Replace(yourString, @"(?<='b[A-Z])[.'s]+(?=[A-Z]'b)|(?<='b[A-Z])'.(?='s[A-Z])", "");

你需要使用正则表达式吗?您可以拆分一个名称,然后根据您对右的想法插入空格(如果您找到新模式,可能会更容易更改)。像这样:

string FixName(string name)
    {
        StringBuilder sb=new StringBuilder();
        var ar=name.Replace('.',' ').Split(' ');
        for (int i = 0; i < ar.Length; i++)
        {
            sb.Append(ar[i]);
            if (i < ar.Length - 1 && ar[i+1].Length>1)
                sb.Append(" ");
        }
        return sb.ToString();
    }