Split string by commas ignoring any punctuation marks (including ',') in quotation marks

前端 未结 6 1714
甜味超标
甜味超标 2021-01-22 06:10

How can I split string (from a textbox) by commas excluding those in double quotation marks (without getting rid of the quotation marks), along with other poss

相关标签:
6条回答
  • You could try the below regex which uses positive lookahead,

    string value = @"apple, orange, ""baboons, cows"", rainbow, ""unicorns, gummy bears""";
    string[] lines = Regex.Split(value, @", (?=(?:""[^""]*?(?: [^""]*)*))|, (?=[^"",]+(?:,|$))");
    
    foreach (string line in lines) {
    Console.WriteLine(line);
    }
    

    Output:

    apple
    orange
    "baboons, cows"
    rainbow
    "unicorns, gummy bears"
    

    IDEONE

    0 讨论(0)
  • 2021-01-22 06:26

    Another Regex solution:

    private static IEnumerable<string> Parse(string input)
    {
      // if used frequently, should be instantiated with Compiled option
      Regex regex = new Regex(@"(?<=^|,\s)(\""(?:[^\""]|\""\"")*\""|[^,\s]*)");
    
      return regex.Matches(inputData).Where(m => m.Success);
    }
    
    0 讨论(0)
  • 2021-01-22 06:27

    Try this:

    Regex str = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
    
    foreach (Match m in str.Matches(input))
    {
        Console.WriteLine(m.Value.TrimStart(','));
    }
    

    You may also try to look at FileHelpers

    0 讨论(0)
  • 2021-01-22 06:33

    Try with this it will work u c an split array string in many waysif you want to split by white space just put a space in (' ') .

      namespace LINQExperiment1
      {
      class Program
      {
      static void Main(string[] args)
      {
       string[] sentence = new string[] { "apple", "orange", "baboons  cows", " rainbow", "unicorns  gummy bears" };
    
      Console.WriteLine("option 1:"); Console.WriteLine("————-");
      // option 1: Select returns three string[]’s with
      // three strings in each.
      IEnumerable<string[]> words1 =
      sentence.Select(w => w.Split(' '));
      // to get each word, we have to use two foreach loops
      foreach (string[] segment in words1)
      foreach (string word in segment)
      Console.WriteLine(word);
      Console.WriteLine();
      Console.WriteLine("option 2:"); Console.WriteLine("————-");
      // option 2: SelectMany returns nine strings
      // (sub-iterates the Select result)
      IEnumerable<string> words2 =
      sentence.SelectMany(segment => segment.Split(','));
      // with SelectMany we have every string individually
      foreach (var word in words2)
      Console.WriteLine(word);
      // option 3: identical to Opt 2 above written using
      // the Query Expression syntax (multiple froms)
      IEnumerable<string> words3 =from segment in sentence
      from word in segment.Split(' ')
      select word;
       }
      }
     }
    
    0 讨论(0)
  • 2021-01-22 06:34

    Much like a CSV parser, instead of Regex, you can loop through each character, like so:

    public List<string> ItemStringToList(string inputString)
    {  
        var itemList   = new List<string>();
        var currentIem = "";
        var quotesOpen = false;
    
        for (int i = 0; i < inputString.Length; i++)
        {
            if (inputString[i] == '"')
            {
                quotesOpen = !quotesOpen;
                continue;
            }
    
            if (inputString[i] == ',' && !quotesOpen)
            {
                itemList.Add(currentIem);
                currentIem = "";
                continue;
            }
    
            if (currentIem == "" && inputString[i] == ' ') continue;
            currentIem += inputString[i];
        }
    
        if (currentIem != "") itemList.Add(currentIem);
    
        return itemList;
    }
    

    Example test usage:

    var test1 = ItemStringToList("one, two, three");
    var test2 = ItemStringToList("one, \"two\", three");
    var test3 = ItemStringToList("one, \"two, three\"");
    var test4 = ItemStringToList("one, \"two, three\", four, \"five six\", seven");
    var test5 = ItemStringToList("one, \"two, three\", four, \"five six\", seven");
    var test6 = ItemStringToList("one, \"two, three\", four, \"five six, seven\"");
    var test7 = ItemStringToList("\"one, two, three\", four, \"five six, seven\"");
    

    You could change it to use StringBuilder if you want faster character joining.

    0 讨论(0)
  • 2021-01-22 06:45

    This was trickier than I thought, a good practical problem I think.

    Below is the solution I came up with for this. One thing I don't like about my solution is having to add double quotations back and the other one being names of the variables :p:

    internal class Program
    {
        private static void Main(string[] args)
        {
    
            string searchString =
                @"apple, orange, ""baboons, cows. dogs- hounds"", rainbow, ""unicorns, gummy bears"", abc, defghj";
    
            char delimeter = ',';
            char excludeSplittingWithin = '"';
    
            string[] splittedByExcludeSplittingWithin = searchString.Split(excludeSplittingWithin);
    
            List<string> splittedSearchString = new List<string>();
    
            for (int i = 0; i < splittedByExcludeSplittingWithin.Length; i++)
            {
                if (i == 0 || splittedByExcludeSplittingWithin[i].StartsWith(delimeter.ToString()))
                {
                    string[] splitttedByDelimeter = splittedByExcludeSplittingWithin[i].Split(delimeter);
                    for (int j = 0; j < splitttedByDelimeter.Length; j++)
                    {
                        splittedSearchString.Add(splitttedByDelimeter[j].Trim());
                    }
                }
                else
                {
                    splittedSearchString.Add(excludeSplittingWithin + splittedByExcludeSplittingWithin[i] +
                                             excludeSplittingWithin);
                }
            }
    
            foreach (string s in splittedSearchString)
            {
                if (s.Trim() != string.Empty)
                {
                    Console.WriteLine(s);
                }
            }
            Console.ReadKey();
        }
    }
    
    0 讨论(0)
提交回复
热议问题