【问题标题】:How to preserve single space or tab between certain characters while removing it from other characters?如何在某些字符之间保留单个空格或制表符,同时将其从其他字符中删除?
【发布时间】:2014-04-24 22:11:11
【问题描述】:

我需要一个 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

【问题讨论】:

  • 这对于像Ro bert Plant 这样的输入开始变得棘手,除非你考虑到大小写。您似乎想要 a) 删除小写字母之间的间距,以及 b) 删除所有连续出现的多个空格。
  • @EricJ。我仅以罗伯特·普兰特(Robert Plant)这个名字为例:这对于任何匹配的单词字母都是相同的,无论名称如何。示例:Cha rlie Brown 变为 Charlie Brown
  • @UnaverageGuy,你是说第一个和第二个名字都以大写字母开头?
  • 这个问题似乎是在做出这样的假设,当然。
  • @ClickRick,是的;我和一位名叫 Mark de Villiers 的同事一起工作!

标签: c#


【解决方案1】:

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

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

【讨论】:

  • 您好,谢谢:如果有多个空格,上面会留下一个空格,而不是删除字母之间的所有空格。
  • @UnaverageGuy 你能举个例子吗?它适用于您上面给出的示例。
  • 好的,为了满足所有位置的所有重复空格,然后删除小写字母之间的空格,我将其分为两步。
  • 这是我尝试过的,我知道问题不是这样提出的,但取决于选项卡的数量,它不起作用:示例:R o be rt Plant 变为 Ro bert Plant
  • @UnaverageGuy 抱歉,不支持大写后跟小写。现在更新了。
【解决方案2】:

你可以使用一些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 是工作示例。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这是手动执行的代码。

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

      【讨论】:

        猜你喜欢
        • 2022-11-22
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多