如何将一组单个字符和白色 space 替换为相同字符但没有白色 space

How do I replace a set of single characters and white space with the same characters but no white space

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

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

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

简单替换“.”后,我剩下 "J K Rowling" 或 "J R R Tolkien"。我想将它们转换成 "JK Rowling" 和 "JRR Tolkien".

所以逻辑是: 捕获单个字符后跟任意数量的白色 space 然后再跟但不包括另一个单个字符。从捕获中删除白色 space 并用清理后的字符串替换捕获。

以下是一些示例:

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

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

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

但我不确定从这里到哪里才能用没有任何白色的版本替换捕获 space。

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

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

DEMO

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

尝试替换

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

.

regex101 demo.

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

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();
    }