如何在某些字符之间保留单个空格或制表符,同时将其从其他字符中删除

本文关键字:字符 制表符 其他 删除 之间 空格 单个 保留 | 更新日期: 2023-09-27 18:00:15

我需要一个C#解决方案来清理一些名称,删除任何空格或制表符、前导或尾随以及字符之间的特定字母。如果单词的最后一个字母和第一个字母的大小写相同,则去掉空格。否则只留下一个空格。

示例:

之前:Rob ert Pla nt

之后:Robert Plant

之前:Ro bert Plant

之后:Robert Plant

注意,由于o和b是相同的情况,所以删除了空格,但由于p是大写,t是小写,所以保留了t和p。

到目前为止,我能做的最好的事情是:

    public static string RemoveMultiSpace(string input)
    {
        return Regex.Replace(input, @"'s+", " ");
    }
    static void Main(string[] args)
    {
        Console.Write(RemoveMultiSpace("Ro bert              Plant"));
        Console.ReadKey();
    }

这是输出:Ro bert Plant,但我需要一个类似于:Robert Plant

如何在某些字符之间保留单个空格或制表符,同时将其从其他字符中删除

的输出

您可以使用此正则表达式来检测两边都有小写字母的空格:

(?<=[a-zA-Z])'s+(?=[a-z])|'s(?='s)

它还删除了零件's(?='s)中的重复空格。

在代码中,它看起来像:

public static string RemoveMultiSpace(string input)
{
    return Regex.Replace(input, @"(?<=[a-zA-Z])'s+(?=[a-z])|'s(?='s)", "");
}

您可以使用一些LINQ:

public static string RemoveMultiSpace(string input)
{
    var indices = input
              .Select((x, idx) => new { x, idx })
              .Where(c => char.IsUpper(c.x))
              .Select(c => c.idx);
    return new string(input
            .Where((x, idx) =>  indices.Any(c => c - 1  == idx) || x != ' ')
            .ToArray());
}

也许代码看起来很复杂,但它基本上是获取大写字母的所有索引,然后过滤字母,如果空白在大写字母之前,它会包括它,否则它会删除空格。

CCD_ 9是一个工作实例。

您只需替换空格,然后在找到的第二个大写字母上插入一个。

        String f = "Char lie Brow n";
        f = f.Replace(" ", "");
        int breakLocation = -1;
        for (int i = 1; i < f.Length; i++)
        {
            if (f[i].ToString() == f[i].ToString().ToUpper())
            {
                breakLocation = i;
                break;
            }
        }
        if (breakLocation > 0)
        {
            f = f.Insert(breakLocation, " ");
        }
        MessageBox.Show(f);

这是手动执行的代码。

        public static string RemoveMultiSpace(string input)
    {
        if (string.IsNullOrEmpty(input)) { return "Wrong input"; }
        input = input.TrimEnd().TrimStart();
        StringBuilder result = new StringBuilder();
        for (int x = 0; x < input.Length; x++)
        {
            // add letter if not space or tab
            if (input[x] != ' ' && input[x] != ''t')
            {
                result.Append(input[x]);
            }
            else
            {
                char char2Append = input[x];
                char lastLetter = input[x - 1];
                char firstLetter = ''0';
                //find first letter of the next word
                while (input[x + 1] == ' ' || input[x + 1] == ''t')
                {
                    x++;
                }
                firstLetter = input[x + 1];
                if (lastLetter >= 97 && lastLetter <= 122 && firstLetter >= 65 && firstLetter <= 90)
                {
                    result.Append(char2Append);
                }
            }
        }
        return result.ToString();
    }