Preface: This question is a derivative of this question.
using System;
using System.Linq;
using System.Text.RegularExpressions;
class MainClass {
public static void Main (string[] args) {
const string rawLine = "\"TeamName\",\"PlayerName\",\"Position\" \"Chargers\",\"Philip Rivers\",\"QB\" \"Colts\",\"Peyton Manning\",\"QB\" \"Patriots\",\"Tom Brady\",\"QB\"";
var parsedLines = Regex.Split(rawLine, "(\".*? \"(?:,\".*? \")*)");
parsedLines.ToList().ForEach(Console.WriteLine);
Console.WriteLine("Press [ENTER] to exit.");
Console.ReadLine();
}
}
Here is my output:
"TeamName","PlayerName","Position" "
Chargers
","Philip Rivers","QB" "
Colts
","Peyton Manning","QB" "
Patriots","Tom Brady","QB"
Press [ENTER] to exit.
And here is my desired output:
"TeamName","PlayerName","Position"
"Chargers","Philip Rivers","QB"
"Colts","Peyton Manning","QB"
"Patriots","Tom Brady","QB"
Press [ENTER] to exit.
How can I fix the regex to generate my desired output?
Relevant:
As Amy has already mentioned, your string seems to be something like CSV. If it is really a valid CSV - use special libraries.
If CSVHelper isn't applicable in this case and you really need regex, try something like this one:
I haven't coded for C#, so regex may need some edits due to c# specific.
Edit. Code example.
This code with "dirty" fix for assertion error. However, i can't reproduce it with onlinetool :) Original regex commented in this example.
I hope, this will help you. But i must say again if you working with csv - it is better to use special tools, not regex :)
Use negative lookbehind, positive lookbehind, character class with quanitifer, positive lookahead, and negative lookahead.
Working Demo
Good comments through-out the thread (I would strongly suggest pursuing one of those options), I wont focus on them. Here's an alternative solution that uses
Matches
from theRegex
pattern,skip
how many fields you have (columns) and thentake
how many records you want.I'm using a pattern like
(\"(.*?)[^,]")
and explanation can be found here of what it means.Please note, there's no error checking at all, can be improved, but does produces the output you need. *Also make sure you import
System.Linq
if not already there.Output Test