【问题标题】:trim all strings in an array修剪数组中的所有字符串
【发布时间】:2009-08-31 03:50:06
【问题描述】:

我有一个字符串,如下所示:

string email = "a@a.com, b@b.com, c@c.com";

我想把它拆分成一个字符串数组

如果我这样做:

string[] emails = email.Split(',');

每个电子邮件地址前面都有空格(在第一个之后):

emails[0] = "a@a.com"
emails[1] = " b@b.com"
emails[2] = " c@c.com"

获得此信息的最佳方法是什么(更好的解析方法或修剪数组中所有字符串的方法)?

emails[0] = "a@a.com"
emails[1] = "b@b.com"
emails[2] = "c@c.com"

【问题讨论】:

  • 如果空间将始终在那里,您可以将其添加到拆分...即:email.Split(', ');

标签: c# .net arrays trim


【解决方案1】:
emails.Split(',').Select(email => email.Trim()).ToArray()

【讨论】:

  • @Moismyname:我不确定什么约束会引导你走上这条路,但还有其他答案可以解决你的问题。
  • 干净整洁。非常适合我。谢谢!
  • 这比接受的答案要好,因为问题是修剪每个字符串,不一定用空格替换空格。
  • @IrfanUllah:链接.Where(email => email != null)
  • @MinhTran 这确实是一个函数调用——Select 是在System.Linq 命名空间中构成LINQ 的一系列扩展方法。
【解决方案2】:

您还可以替换所有出现的空格,从而避免 foreach 循环:

string email = "a@a.com, b@b.com, c@c.com";    
string[] emails = email.Replace(" ", "").Split(',');

【讨论】:

  • 在这个特定示例中可以正常工作,但不会为结果元素保留空格,例如; “foo bar,另一个元素,blah_blah”。 Bryan Watts 给出了 IMO 的最佳答案。
  • 嗨@revgum!这是真的,但我坚持遵守@leora 的要求。你所描述的例子,IMO,不在这个问题的范围内。无论如何感谢您的反馈。
  • -1 我同意这不是一件好事。买家小心。
  • 也被否决了。我同意答案可以解决问题,但总体而言,Bryan 的答案更有用
  • 这是不对的。它不会修剪,而是从数组中的字符串中去除空格,这与修剪完全不同(去除尾随和前导空格)
【解决方案3】:

以下任何一项都可以。我推荐第一个,因为它更准确地表达了连接字符串。

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None);
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);

【讨论】:

  • +1 我不知道这些选项。来自 Perl,我到处都能看到正则表达式。使用选项拆分是要走的路。
  • +1 我们经常使用 LINQ,以至于我们往往会忘记确实存在其他优雅的选项。
【解决方案4】:

你可以使用 Trim():

string email = "a@a.com, b@b.com, c@c.com";
string[] emails = email.Split(',');
emails = (from e in emails
          select e.Trim()).ToArray();

【讨论】:

【解决方案5】:

使用Regex.Split 避免修剪

var emails = Regex.Split(email, @",\s*");

【讨论】:

    【解决方案6】:

    您可以使用这样的单行解决方案:

    string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
    Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim());
    

    【讨论】:

      【解决方案7】:

      如果只需要操作条目,不返回数组:

      string[] emails = text.Split(',');
      Array.ForEach(emails, e => e.Trim());
      

      【讨论】:

        【解决方案8】:

        .NET 5 已经到来,它是这个问题的现代解决方案:

        string[] emails = email.Split(',', StringSplitOptions.TrimEntries);
        

        【讨论】:

        • 这应该被认为是最好的选择,因为它比这里的任何其他答案都更好
        【解决方案9】:

        或者,您可以使用以下形式的正则表达式进行拆分:

        \s*,\s*
        

        string[] emails = Regex.Split(email, @"\s*,\s*");
        

        它会直接消耗周围的空间。

        正则表达式通常会影响性能,但您提供的示例表明这是您计划在代码中为短数组执行一次的操作。

        【讨论】:

          【解决方案10】:

          Bryan Watts 的回答优雅而简单。他隐含地引用了由 Split() 创建的字符串数组。

          如果您正在读取文件并希望在构建数组时处理数据,请注意它的可扩展性。

          string sFileA = @"C:\Documents and Settings\FileA.txt";
          string sFileB = @"C:\Documents and Settings\FileB.txt";
          
          // Trim extraneous spaces from the first file's data
          string[] fileAData = (from line in File.ReadAllLines( sFileA )
                                select line.Trim()).ToArray();
          
          // Strip a second unneeded column from the second file's data
          string[] fileBData = (from line in File.ReadAllLines( sFileB )
                                select line.Substring( 0, 21 ).Trim()).ToArray();
          

          当然,如果您愿意,也可以使用 Linq => 表示法。

          string[] fileBData = File.ReadAllLines( sFileB ).Select( line =>
                                       line.Substring( 0, 21 ).Trim()).ToArray();
          

          虽然我的回答应该作为评论发布,但我还没有足够的声望点来发表评论。但我发现这个讨论对于弄清楚如何在使用 ReadAllLines() 时处理数据非常有用。

          【讨论】:

          • 欢迎来到Stack Overflow。代码中的一个小点:如果您正在使用这样的 Linq,那么使用 File.ReadLines 可能会更好。 ReadAllLines 将整个文件“啜”到内存中的一个数组中,这对于大文件来说显然是个问题。 ReadLines 一次只读取一行,如果您不需要保留内容的初始版本,那就太好了。
          • 谢谢!我可以看到,使用 ReadAllLines 的示例将暂时分解非常大的文件,这些文件同时包含内存中的原始数据和修剪后的版本。 File.ReadLines() 的文档页面也有一个适合此讨论的示例。
          【解决方案11】:

          foreach 循环中使用String.Trim,或者如果您使用的是.NET 3.5+ LINQ 语句。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-01
            • 2011-10-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-16
            • 2017-04-18
            • 2021-12-31
            相关资源
            最近更新 更多