在 C# 中过滤逗号分隔的字符串

Posted

技术标签:

【中文标题】在 C# 中过滤逗号分隔的字符串【英文标题】:Filtering comma separated String in C# 【发布时间】:2011-10-19 07:18:00 【问题描述】:

我有一个动态字符串值,它可能包含这样的值

"Apple   ,Banana, , , ,  Mango  ,Strawberry  , " 

我想像这样过滤这个字符串

"Apple,Banana,Mango,Strawberry". 

我已尝试使用以下代码并且它有效。

在 C#(.NET 2.0) 中是否有更好的方法来实现相同的目标?

/// <summary>
/// Convert "Comma Separated String" to "Comma Separated String"
/// </summary>
/// <param name="strWithComma">String having values separated by comma</param>
/// <returns>String separated with comma</returns>
private String CommaSeparatedString(String strWithComma)

    String rtn = String.Empty;

    List<String> newList= new List<string>();

    if (String.IsNullOrEmpty(strWithComma))
    
        return rtn;
    

    String[] strArray = strWithComma.Split(",".ToCharArray());


    if (strArray == null || strArray.Length == 0)
    
        return rtn;
    

    String tmpStr = String.Empty;
    String separator=String.Empty;
    foreach (String s in strArray)
    
        if (!String.IsNullOrEmpty(s))
        
            tmpStr =s.Replace(Environment.NewLine, String.Empty);
            tmpStr = tmpStr.Trim();
            if (!String.IsNullOrEmpty(tmpStr))
            
                newList.Add(tmpStr);
            
        
    

    if (newList != null && newList.Count > 0)
    

        rtn = String.Join(",", newList.ToArray());
    
    return rtn;


【问题讨论】:

对于 codereview.stackexchange.com. 逗号之间可以有多个单词吗? @Rune,如果逗号中有多个单词,我想保留它,因为它正在考虑单词之间的单个空格。虽然我没有在我的帖子中提到这一点。非常感谢您的澄清。 您说您使用的是 .NET 2.0,但 C# 是什么版本? (C# 3.5 使用 .NET 2.0) 感谢大家分享美丽的代码。我有你们大家的一些好主意来解决这个问题。 【参考方案1】:

你也可以使用正则表达式:

string str = @"Apple   ,,Banana, , , ,  Mango  ,Strawberry  , ";
string result = Regex.Replace(str, @"(\s*,\s*)+", ",").TrimEnd(',');

【讨论】:

+1 表示可行的解决方案,即使是“多个单词”和 NewLine 场景【参考方案2】:

我相信以下内容应该适用于任何 .NET 版本:

string[] TrimAll( string[] input )

    var result = new List<string>();
    foreach( var s in input )
        result.Add( s.Trim() );
    
    return result.ToArray();


var delimiters = new []  ",", "\t", Environment.NewLine ;
string result = string.Join(",", TrimAll( input.Split( delimiters, StringSplitOptions.RemoveEmptyEntries ) ) );

编辑:更新以处理空格、制表符和换行符。

【讨论】:

很遗憾,StringSplitOptions.RemoveEmptyEntries 不会删除仅包含空格的整数。 空白和换行呢?谢谢。 @Konamiman true 但只需将空格添加到分隔符数组中,它就像您的答案一样工作(对于合法的空格也有同样的问题) @ANeves 你真的花时间阅读整个评论吗? konamimans 建议的解决方案的问题是它不会像此解决方案那样保留单词之间的空格,即使修复了 konamiman 指出的所有错误(在较短的版本中)也在您引用的评论中,或者我错过了您的观点? @RuneFS [将删除。] 对不起,你是对的,我看错了。提醒自己,疲劳时不要冲浪。 :(【参考方案3】:

假设您的项目不包含空格:

private String CommaSeparatedString(String strWithComma)

    string[] tokens = strWithComma
        .Replace(" ", "")
        .Split(new char[] ',', StringSplitOptions.RemoveEmptyEntries);
    return string.Join(",", tokens);

现在我不确定 C# 2.0 是否接受 new char[] ',' 语法。如果没有,您可以在其他地方定义数组(例如,作为类私有成员)。

【讨论】:

数组语法从 1.0 开始就有效,所以不会有问题。您的代码不适用于逗号之间的多个单词【参考方案4】:

这是一个单行:

var outputString = string.Join(",", inputString.Replace(" ", string.Empty).Split(new char[]  ',' , StringSplitOptions.RemoveEmptyEntries));

【讨论】:

当单词之间有合法空格时不起作用,如果单词之间不允许空格,则使用 " " 和 "," 进行拆分会更简洁、更快 在我的代码中,我还检查了新的换行符。这段代码会处理新的换行吗? @Rune FS,那会比原帖复杂。考虑这个字符串:"Apple ,Banana, , Pineapple Orange , , Mango ,Strawberry , "。请注意, Pineapple Orange , 以及这些空格是如何放置不明确的。 @Hoque,您能否在必要时更新您的问题? @hoque 不,它也不允许单词之间有空格 @AlexR。是的,但如果你阅读 OPs 回答是否保留那种空白,他说“是的,它应该被保留”并且原始代码确实保留了那个空白【参考方案5】:
Regex regex = new Regex(@"\w(?:(?!,| ).)*");
            var items = regex.Matches("Apple ,Banana, , , , Mango ,Strawberry , ").Cast<Match>().Select(m => m.Value);

.NET 2.0 版本

List<string> newList = new List<string>();

            Regex regex = new Regex(@"\w(?:(?!,| ).)*");
            string str = "Apple ,Banana, , , , Mango ,Strawberry , ";
            MatchCollection matches = regex.Matches(str);
            foreach (Match match in matches)
            
                newList.Add(match.Value);
            

【讨论】:

这行得通...当然你会把 strWithComma 作为第一个参数放在 regex.Matches() 中,而不是像我做的例子那样的文字字符串... 它是否包括删除“新换行符”? 是的。我刚刚在"Apple ,Banana, , , , Mango ,Strawberry , \nOrange" 上试过,没问题 该模式基本上是\w[^, ]*(唯一真正的区别是换行)。如果您确实想要令牌中的空格,可以使用[^\s,][^,]*?(?=\s*,|\s*$)(您可以简化它,看起来太多了)【参考方案6】:
var result = Regex.Replace(strWithComma, ",+", ",").TimEnd(',');
result = Regex.Replace(result, "\s+", string.Empty);

【讨论】:

【参考方案7】:

没有正则表达式,没有拆分和连接,修剪等,O(n) 时间。 StringBuilder 是一个非常好的处理字符串的类。

编辑 如果字符串不以字母结尾,它将添加一个逗号。因此添加了一个额外的 TrimEnd(',')

string strWithComma = ",Apple   ,Banana, , , ,  Mango  ,Strawberry  , \n John,";
var sb = new StringBuilder();
var addComma = false;
foreach (var c in strWithComma )
         
  if (Char.IsLetter(c)) // you might want to allow the dash also: example Anne-Marie
  
    addComma = true;
    sb.Append(c);         
  
  else
           
    if (addComma)
    
      addComma = false;
      sb.Append(','); 
    
    

string rtn = sb.ToString().TrimEnd(',');

【讨论】:

看起来很有趣。应该试一试。【参考方案8】:

警告此方法仅适用于 C# 3.0 或更高版本。对不起,伙计们没有很好地阅读这个问题

这会起作用,但它可以更容易地完成,例如:

string input = "apple,banana,, \n,test\n, ,juice";

var parts = from part in input.Split(',')
            let trimmedPart = part.Replace("\n", "")
            where !string.IsNullOrWhiteSpace(trimmedPart)
            select trimmedPart;

string result = string.Join(",", parts);

【讨论】:

以上是关于在 C# 中过滤逗号分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Where子句Mysql中的逗号分隔字符串参数过滤器

如何用字符串分隔的逗号填充 C# 列表框

C# 正则表达式在 外用逗号分隔

逗号作为小数分隔符空格作为千​​位分隔符C# [重复]

C#如何检测包含逗号分隔的整数列表的变量?

如何使用正则表达式验证逗号分隔的字符串 [重复]