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

时间:2014-04-24 22:11:12

标签: c#

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

示例:

之前:Rob ert Pla nt

之后:Robert Plant

之前:Ro bert Plant

之后:Robert Plant

请注意,空格被删除,因为o和b是相同的情况,但是t和P是保留的,因为P是大写,t是较低。

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

    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

4 个答案:

答案 0 :(得分:2)

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

(?<=[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)", "");
}

答案 1 :(得分:1)

您可以使用某些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());
}

也许代码看起来很复杂但它基本上得到大写字母的所有索引,然后过滤字母,如果 white-space 在它包含它的大写字母之前,否则它会删除空格。

Here是工作示例。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

这是手动执行此操作的代码。

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