【问题标题】:How to Trim exactly 1 whitespace after splitting the string拆分字符串后如何精确修剪1个空格
【发布时间】:2016-11-24 16:51:54
【问题描述】:

我制作了一个程序,通过在管道中拆分字符串来评估字符串,字符串是随机生成的,有时空格是需要评估的一部分。

HftiVfzRIDBeotsnU uabjvLPC | LstHCfuobtv eVzDUBPn jIRfai

这个字符串两边的长度相同(管道左侧的 2 x 空格),但是当我必须修剪管道两侧的空间时,我的问题就出现了(我在拆分后这样做) 有什么方法可以确保我只修剪 1 个空格而不是全部修剪。 到目前为止我的代码:

foreach (string s in str)
    {
        int bugCount = 0;
        string[] info = s.Split('|');
        string testCase = info[0].TrimEnd();
        char[] testArr = testCase.ToCharArray();
        string debugInfo = info[1].TrimStart();
        char[] debugArr = debugInfo.ToCharArray();
        int arrBound = debugArr.Count();
        for (int i = 0; i < arrBound; i++)
            if (testArr[i] != debugArr[i])
                bugCount++;
        if (bugCount <= 2 && bugCount != 0)
            Console.WriteLine("Low");
        if (bugCount <= 4 && bugCount != 0)
            Console.WriteLine("Medium");
        if (bugCount <= 6 && bugCount != 0)
            Console.WriteLine("High");
        if (bugCount > 6)
            Console.WriteLine("Critical");
        else 
            Console.WriteLine("Done");

    }
    Console.ReadLine();

【问题讨论】:

  • 如果要清除管道符号前后的空格,请使用TrimStartTrimEnd dotnetperls.com/trimend
  • 假设您在| 上拆分,只需从 [1] 到 [len-1] 获取字符串的子字符串?
  • 你能显示由代码产生的和想要的结果吗?我不明白TrimEndTrimStart 怎么会在这里造成问题。
  • 如果字符串中有空格,@sharpstudent 将不起作用
  • @Sinatr 我希望它在第 1 节中实际数据的末尾或第 2 节中实际数据的开头时出现空格

标签: c# string split trim


【解决方案1】:

你有两个选择。

  1. 如果管道前后有 总是 1 个空格,则在 {space}|{space} 上拆分。

    myInput.Split(new[]{" | "},StringSplitOptions.None);
    
  2. 否则,不要使用TrimStart()TrimEnd(),而是使用SubString

    var split = myInput.Split('|');
    var s1 = split[0].EndsWith(" ") 
                     ? split[0].SubString(0,split[0].Length-1) 
                     : split[0];
    var s2 = split[1].StartsWith(" ")
                     ? split[1].SubString(1) // to end of line
                     : split[1];
    

注意,这里有一些复杂性 - 如果管道周围没有空格,但最后一个/第一个字符是合法的(数据)空格字符,上面会切断它。你需要更多的逻辑,但希望这会让你开始!

【讨论】:

  • 似乎我误解了一些东西,当我尝试使用方法 1 时,我得到“无法从 'string[]' 转换为 'char'
  • @Claudi - 查看更新,我忘了overload of string.Split 你需要通过StringSplitOptions
【解决方案2】:

没有办法告诉Trim.. 方法族在删除一些字符后停止。

一般情况下,您需要手动检查在Split 之后获得的部分并检查它们的第一个/最后一个字符和子串以获得正确的部分。

但是,在您的情况下,有一个更简单的方法 - 拆分也可以将 string 作为参数,甚至更多 - 一组字符串:

string[] info = s.Split(new []{ " | " });
// or even
string[] info = s.Split(new []{ " | ", " |", "| ", "|" });

这应该通过简单地将它们视为分隔符的一部分来处理管道 | 字符周围的单个空格。

【讨论】:

  • 是的,我同意。我只以为我可以在一个字符上分裂,这对我有很多帮助。
【解决方案3】:

这是一个字符串扩展,用于为计数时间修剪空间,以防万一。

public static class StringExtension
{
    /// <summary>
    /// Trim space at the end of string for count times
    /// </summary>
    /// <param name="input"></param>
    /// <param name="count">number of space at the end to trim</param>
    /// <returns></returns>
    public static string TrimEnd(this string input, int count = 1)
    {
        string result = input;
        if (count <= 0)
        {
            return result;
        }
        if (result.EndsWith(new string(' ', count)))
        {
            result = result.Substring(0, result.Length - count);
        }
        return result;
    }
    /// <summary>
    /// Trim space at the start of string for count times
    /// </summary>
    /// <param name="input"></param>
    /// <param name="count">number of space at the start to trim</param>
    /// <returns></returns>
    public static string TrimStart(this string input, int count = 1)
    {
        string result = input;
        if (count <= 0)
        {
            return result;
        }
        if (result.StartsWith(new string(' ', count)))
        {
            result = result.Substring(count);
        }
        return result;
    }
}

主要

static void Main(string[] args)
{
   string a = "1234  ";
   string a1 = a.TrimEnd(1); // returns "1234 "
   string a2 = a.TrimEnd(2); // returns "1234"
   string a3 = a.TrimEnd(3); // returns "1234  "

   string b = "  5678";
   string b1 = b.TrimStart(1); // returns " 5678"
   string b2 = b.TrimStart(2); // returns "5678"
   string b3 = b.TrimStart(3); // returns "  5678"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2012-06-27
    • 2010-09-16
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多