首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#拆分逗号分隔值

问C#拆分逗号分隔值
EN

Stack Overflow用户
提问于 2013-12-20 10:12:08
回答 4查看 2.7K关注 0票数 2

如何用也可以包含逗号的引号分隔逗号分隔字符串?

示例输入

代码语言:javascript
复制
John, Doe, "Sid, Nency", Smith

预期输出:

  • 约翰
  • 无名氏
  • 西德河
  • 史密斯

用逗号分隔是可以的,但我已经要求允许使用"Sid,Nency“这样的字符串。我试图使用regexes来分割这些值。Regex ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"来自Java,它对我的.NET代码不起作用。它使一些字符串加倍,找到额外的结果等。

那么,怎样才能最好地分割这些字符串呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-20 10:24:39

是因为抓捕组的缘故。把它变成一个非捕获组:

代码语言:javascript
复制
",(?=(?:[^""]*""[^""]*"")*[^""]*$)"
      ^^

捕获组包括在您的结果中捕获的部分。

ideone演示

代码语言:javascript
复制
var regexObj = new Regex(@",(?=(?:[^""]*""[^""]*"")*[^""]*$)");
regexObj.Split(input).Select(s => s.Trim('\"', ' ')).ForEach(Console.WriteLine);

把结果修剪一下。

票数 4
EN

Stack Overflow用户

发布于 2013-12-20 10:18:23

只要穿过你的绳子。当你穿过你的绳子时,保持追踪

不管你是不是在“街区”里。如果你-别把逗号当成

逗号(作为分隔符)。否则就把它当作这样对待。很简单

算法,我会自己写。当你第一次遇到“你进入”

一个街区。当你遇到下一个",你结束了你曾经的那块,等等。

所以你只需一次穿过你的绳子就可以做到。

代码语言:javascript
复制
import java.util.ArrayList;


public class Test003 {

    public static void main(String[] args) {
        String s = "  John, , , , \" Barry, John  \" , , , , , Doe, \"Sid ,  Nency\", Smith  ";

        StringBuilder term = new StringBuilder();
        boolean inQuote = false;
        boolean inTerm = false;
        ArrayList<String> terms = new ArrayList<String>();
        for (int i=0; i<s.length(); i++){
            char ch = s.charAt(i);
            if (ch == ' '){
                if (inQuote){
                    if (!inTerm) { 
                        inTerm = true;
                    }
                    term.append(ch);
                }
                else {
                    if (inTerm){
                        terms.add(term.toString());
                        term.setLength(0);
                        inTerm = false;
                    }
                }
            }else if (ch== '"'){
                term.append(ch); // comment this out if you don't need it
                if (!inTerm){
                    inTerm = true;
                }
                inQuote = !inQuote;
            }else if (ch == ','){
                if (inQuote){
                    if (!inTerm){
                        inTerm = true;
                    }
                    term.append(ch);
                }else{
                    if (inTerm){
                        terms.add(term.toString());
                        term.setLength(0);
                        inTerm = false;
                    }
                }
            }else{
                if (!inTerm){
                    inTerm = true;
                }
                term.append(ch);
            }
        }

        if (inTerm){
            terms.add(term.toString());
        }

        for (String t : terms){
            System.out.println("|" + t + "|");
        }

    }



}
票数 1
EN

Stack Overflow用户

发布于 2013-12-20 10:29:31

我在Csv解析器类中使用了以下代码来实现这一点:

代码语言:javascript
复制
    private string[] ParseLine(string line)
    {
        List<string> results = new List<string>();
        bool inQuotes = false;
        int index = 0;
        StringBuilder currentValue = new StringBuilder(line.Length);
        while (index < line.Length)
        {
            char c = line[index];
            switch (c)
            {
                case '\"':
                    {
                        inQuotes = !inQuotes;
                        break;
                    }

                default:
                    {
                        if (c == ',' && !inQuotes)
                        {
                            results.Add(currentValue.ToString());
                            currentValue.Clear();
                        }
                        else
                            currentValue.Append(c);
                        break;
                    }
            }
            ++index;
        }

        results.Add(currentValue.ToString());
        return results.ToArray();
    }   // eo ParseLine
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20701179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档