Такое чувство, что вам нужно разобрать:
DOUBLEQUOTE = "
OTHER = anything that isn't a double quote
EXCLAMATION = !
ITEM = (DOUBLEQUOTE (OTHER | (DOUBLEQUOTE OTHER DOUBLEQUOTE))* DOUBLEQUOTE
LINE = ITEM (EXCLAMATION ITEM)*
Такое ощущение, что можно создать регулярное выражение для вышеперечисленного (при условии, что двойные кавычки в ITEM не могут быть вложены еще дальше), НО, возможно, лучше использовать очень простой грамматик.
Это может сработать ... исключая пропущенные побеги и тому подобное
^"([^"]*|"[^"]*")*"(!"([^"]*|"[^"]*")*")*$
Другим вариантом будет сопоставление с первой частью, а затем, если есть! И более, обрежьте! и продолжайте сопоставлять (извините за отсутствие конкретного языка, я просто пытаюсь проиллюстрировать идею):
resultList = []
while(string matches \^"([^"]*|"[^"]*")*(.*)$" => match(1)) {
resultList += match
string = match(2)
if(string.beginsWith("!")) {
string = string[1:end]
} elseif(string.length > 0) {
// throw an error, since there was no exclamation and the string isn't done
}
}
if(string.length > 0) {
// throw an exception since the string isn't done
}
resultsList == the list of items in the string
РЕДАКТИРОВАТЬ: Я понял, что мой ответ на самом деле не работает. Вы можете использовать двойные кавычки внутри строк, а также восклицательные знаки. Таким образом, вы действительно не можете иметь "!" внутри одной из струн. Таким образом, идея 1) снять кавычки с концов, 2) разделить на «!» Действительно правильный путь.