I am trying to write a class that can parse an iCalendar file and am hitting some brick walls. Each line can be in the format:
PARAMETER[;PARAM_PROPERTY..]:VALUE[,VALUE2..]
It’s pretty easy to parse with either a bunch of splits or regex’s until you find out that values can have backticked commas, also they can be double quote marked which makes life hard. for example:
PARAMETER:"my , cool, value",value\,2,value3
In this example you are meant to pull out the three values:
- my , cool value
- value,2
- value3
Which makes it a little more difficult.
Suggestions?
Go through the file char by char and split the values manually, whenever you have a quotation mark you enter “quotation mode” where you won’t split at commas and when the closing quotation mark comes you leave it.
For the backticked commas: If you read in a backslash you also read the next character and decide what to do with it then.
Of course that’s not extremely efficient, but you can’t use regular expressions for this. I mean you can, but since I believe that there also can be escaped quotation marks this is going to be really messy.
If you want to give it a try though:
"[^"]*"(?<!\\)"[^"]*(?<!\\)"(?<!\\)"[^"|(?<=\\)"]*(?<!\\)"So you see it very fast get’s messy, so I would suggest to you to read it in characterwise.