Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中逗号分隔字符串的过滤#_C#_.net_Arrays_String_C# 2.0 - Fatal编程技术网

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

C# C语言中逗号分隔字符串的过滤#,c#,.net,arrays,string,c#-2.0,C#,.net,Arrays,String,C# 2.0,我有一个动态字符串值,它可能包含如下值 "Apple ,Banana, , , , Mango ,Strawberry , " 我想像这样过滤这个字符串 "Apple,Banana,Mango,Strawberry". 我已经尝试了下面的代码,它是有效的 在C#(.NET2.0)中有没有更好的方法来实现同样的目标 // ///将“逗号分隔字符串”转换为“逗号分隔字符串” /// ///用逗号分隔值的字符串 ///用逗号分隔的字符串 专用字符串逗号分隔字符串(字符串strWit

我有一个动态字符串值,它可能包含如下值

"Apple   ,Banana, , , ,  Mango  ,Strawberry  , " 
我想像这样过滤这个字符串

"Apple,Banana,Mango,Strawberry". 
我已经尝试了下面的代码,它是有效的

在C#(.NET2.0)中有没有更好的方法来实现同样的目标

//
///将“逗号分隔字符串”转换为“逗号分隔字符串”
/// 
///用逗号分隔值的字符串
///用逗号分隔的字符串
专用字符串逗号分隔字符串(字符串strWithComma)
{
String rtn=String.Empty;
List newList=新列表();
if(String.IsNullOrEmpty(strWithComma))
{
返回rtn;
}
字符串[]strArray=strWithComma.Split(“,”.ToCharArray());
if(strArray==null | | strArray.Length==0)
{
返回rtn;
}
String tmpStr=String.Empty;
字符串分隔符=String.Empty;
foreach(strArray中的字符串s)
{
如果(!String.IsNullOrEmpty)
{
tmpStr=s.Replace(Environment.NewLine,String.Empty);
tmpStr=tmpStr.Trim();
如果(!String.IsNullOrEmpty(tmpStr))
{
newList.Add(tmpStr);
}
}
}
if(newList!=null&&newList.Count>0)
{
rtn=String.Join(“,”,newList.ToArray());
}
返回rtn;
}

警告此方法仅适用于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);

我相信以下内容在任何.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 ) ) );
string[]TrimAll(string[]input)
{
var result=新列表();
foreach(输入中的var s)
结果。添加(s.Trim());
}
返回result.ToArray();
}
var delimiters=new[]{“,”,“\t”,Environment.NewLine};
字符串结果=string.Join(“,”,TrimAll(输入.Split(分隔符,StringSplitOptions.RemoveEmptyEntries));

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

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

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

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

private String CommaSeparatedString(String strWithComma)
{
    string[] tokens = strWithComma
        .Replace(" ", "")
        .Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
    return string.Join(",", tokens);
}
现在我不确定C#2.0是否接受
newchar[]{',}
语法。如果没有,您可以在其他地方定义数组(例如,作为类私有成员)。

Regex Regex=new Regex(@“\w(?:(?!,|))*”;
var items=regex.Matches(“苹果、香蕉、芒果、草莓”).Cast().Select(m=>m.Value);
.NET2.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);
            }
List newList=newList();
正则表达式正则表达式=新正则表达式(@“\w(?(?!,|))*”;
string str=“苹果、香蕉、芒果、草莓”;
MatchCollection matches=regex.matches(str);
foreach(匹配中的匹配)
{
newList.Add(match.Value);
}
这是一条单行线:

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

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

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



对于codereview.stackexchange.com,逗号之间可以有多个单词吗?@Rune,如果逗号中有多个单词,我想保留它,因为它考虑的是单词之间的单个空格。虽然我在帖子中没有提到这一点。非常感谢您的澄清。您说您使用的是.NET2.0,但C#的哪个版本?(C#3.5使用.NET2.0)感谢大家分享您美丽的代码。我从你们所有人那里得到了一些好主意来解决这个问题。这很有效。。。当然,您会将strWithComma作为regex.Matches()中的第一个参数,而不是像我在示例中所做的那样作为文本字符串……它是否涵盖删除“新行提要”?是的。我刚刚在苹果、香蕉、芒果、草莓、诺兰奇上试用过,很好,基本上是这样的(唯一真正的区别是新的线条)。如果您确实想在标记中使用空格,可以使用
[^\s,][^,]*?(?=\s*,|\s*$)
(您可能可以简化,看起来太多了)不幸的是
StringSplitOptions。RemoveEmptyEntries
不会删除仅包含空格的实体。空白和换行符呢?谢谢。@Konamiman为真,但只需在分隔符数组中添加空格,它的工作原理与您的答案相同(合法空格也有同样的问题)@ANeves您真的花时间阅读了整个评论吗?科纳米曼建议的解决方案存在的问题是,即使修复了科纳米曼指出的错误(在较短的版本中),也不会像此解决方案那样保留单词之间的空白,或者我没有领会你的意思?@RuneFS[将删除。]对不起,你是对的,我误读了。注意自己,疲劳时不要冲浪(数组语法已从1.0开始生效,因此这不会是一个问题。您的代码无法在逗号之间使用多个单词。如果单词之间有合法空格,则该代码将无法工作,如果使用“”和“”,则该代码将更干净、更快。)如果在我的代码中不允许有空格,我也检查新的换行符。这个代码会处理新的换行符吗?@符文FS,那么它会比原来的帖子更复杂。请考虑这个字符串:<代码>“苹果,香蕉,菠萝橙,芒果,Strawberry”。。请注意
、菠萝橙、
以及空格的位置含糊不清。@Hoque,请在必要时更新您的问题好吗?@Hoque不,它不允许在单词之间留空格either@AlexR.是的,会的,但如果你读到OPs关于是否保留这种空白的答案,他说“是的,应该保留”而原始代码确实保留了空格+1作为一个有效的解决方案,即使对于“多个单词”和新行场景也很有趣。应该尝试一下。
Regex regex = new Regex(@"\w(?:(?!,| ).)*");
            var items = regex.Matches("Apple ,Banana, , , , Mango ,Strawberry , ").Cast<Match>().Select(m => m.Value);
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);
            }
var outputString = string.Join(",", inputString.Replace(" ", string.Empty).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
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(',');