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

时间:2015-01-14 00:43:38

标签: c# regex

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

  • JK罗琳
  • J.K。罗林
  • 学家K.罗琳
  • J K Rowling

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

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

在轻松更换“。”之后,我留下了“J K Rowling”或“J R R Tolkien”。我想把它们转换成“JK罗琳”和“JRR托尔金”。

所以逻辑是: 捕获单个字符后跟任意数量的空格,然后跟随但不包括另一个单个字符。从捕获中移除空白区域,并用清理过的字符串替换捕获。

以下是一些示例:

  • J R R Tolkien - > JRR Tolkien
  • E L James - > EL James
  • F Scott Fitzgerald - >没有变化

我已经到了这一点,我能够捕捉到我需要的角色:

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

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

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

3 个答案:

答案 0 :(得分:3)

尝试替换

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

$1

regex101 demo.

答案 1 :(得分:2)

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

@"(?<=\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])", "");

答案 2 :(得分:1)

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

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