Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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#_Regex_Csv - Fatal编程技术网

C# 除引号外,正则表达式以逗号分隔

C# 除引号外,正则表达式以逗号分隔,c#,regex,csv,C#,Regex,Csv,除了用双引号括起来外,在逗号(,)上拆分的正则表达式是什么?例如: max,emily,john = ["max", "emily", "john"] 但是 希望在C#中使用:Regex.Split(字符串,“PATTERN-HERE”) 谢谢。像这样的情况通常需要正则表达式以外的东西。它们很漂亮,但是处理这类事情的模式比它们有用的要复杂得多 您可以尝试以下方法: public static IEnumerable<string> SplitCSV(string csvString

除了用双引号括起来外,在逗号(,)上拆分的正则表达式是什么?例如:

max,emily,john = ["max", "emily", "john"]
但是

希望在C#中使用:
Regex.Split(字符串,“PATTERN-HERE”)


谢谢。

像这样的情况通常需要正则表达式以外的东西。它们很漂亮,但是处理这类事情的模式比它们有用的要复杂得多

您可以尝试以下方法:

public static IEnumerable<string> SplitCSV(string csvString)
{
    var sb = new StringBuilder();
    bool quoted = false;

    foreach (char c in csvString) {
        if (quoted) {
            if (c == '"')
                quoted = false;
            else
                sb.Append(c);
        } else {
            if (c == '"') {
                quoted = true;
            } else if (c == ',') {
                yield return sb.ToString();
                sb.Length = 0;
            } else {
                sb.Append(c);
            }
        }
    }

    if (quoted)
        throw new ArgumentException("csvString", "Unterminated quotation mark.");

    yield return sb.ToString();
}
公共静态IEnumerable SplitCSV(字符串csvString)
{
var sb=新的StringBuilder();
bool-quoted=false;
foreach(csvString中的字符c){
如果(引用){
如果(c==“”)
引用=假;
其他的
sb.附加(c);
}否则{
如果(c==“”){
引用=正确;
}else如果(c==','){
让某人返回字符串();
sb.长度=0;
}否则{
sb.附加(c);
}
}
}
如果(引用)
抛出新的ArgumentException(“csvString”,“Unterminated引号”);
让某人返回字符串();
}

可能需要进行一些调整才能完全遵循CSV规范,但基本逻辑是合理的。

这是CSV解析器的一个明确案例,因此您应该使用.NET自己的CSV解析功能或cdhowie的解决方案

仅供参考,并非作为一个可行的解决方案,以下是使用正则表达式和
Regex.Split()

您可以使用正则表达式(请不要!)


(?可能有点晚,但我希望我能帮助别人

     String[] cols = Regex.Split("max, emily, john", @"\s*,\s*");
     foreach ( String s in cols ) {
        Console.WriteLine(s);
     }

贾斯汀,重新提出这个问题,因为它有一个简单的正则表达式解决方案,但没有提到。这种情况听起来很简单

下面是我们的简单正则表达式:

"[^"]*"|(,)
交替的左侧匹配完整的
“带引号的字符串”
标记。我们将忽略这些匹配。右侧匹配并捕获逗号到组1,我们知道它们是右逗号,因为它们与左侧的表达式不匹配。我们将这些逗号替换为
拆分此处
,然后在
拆分此处
上拆分

此程序显示了如何使用正则表达式(请参见列表底部的结果):

参考


字段中的引号是如何引用的?是
还是
\"
?我不认为这可以在正则表达式中完成。即使可以,它也肯定不漂亮。您当前正在从字符串中删除引号。您是否应该将逻辑更改为始终附加
c
,除非它是逗号?不。周围的引号应该根据OP删除。转义逗号;它们不是sel的数据当然,如果数据确实在某处包含有意义的引号,那么这个解决方案将不起作用,但这还没有被指出。谢谢。:)如果OP指出引号可以转义或类似的内容,我当然也愿意改进它。你能提供一个用例示例吗?例如,我正在做:public CSV(string p_CSV_full_path){data=new List();try{using(StreamReader readFile=new StreamReader(p_CSV_full_path)){string line;string[]行;while((line=readFile.ReadLine())!=null){IEnumerable row_enumerable=this.SplitCSV(line);//data.Add(row)}}catch(Exception ex){throw ex;}}}问题是我需要SplitCSV的结果是一个字符串数组,这样我才能添加到列表中。啊,是的,我的错。我已经更新了答案中的代码来修复这个错误。当字符串包含双引号时,这个答案不会处理OPs的情况。
     String[] cols = Regex.Split("max, emily, john", @"\s*,\s*");
     foreach ( String s in cols ) {
        Console.WriteLine(s);
     }
"[^"]*"|(,)
using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program
{
static void Main()  {
string s1 = @"max,""emily,kate"",john";
var myRegex = new Regex(@"""[^""]*""|(,)");
string replaced = myRegex.Replace(s1, delegate(Match m) {
    if (m.Groups[1].Value == "") return m.Value;
    else return "SplitHere";
    });
string[] splits = Regex.Split(replaced,"SplitHere");
foreach (string split in splits) Console.WriteLine(split);
Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();
} // END Main
} // END Program