Регулярное выражение для игнорирования последовательных кавычек в строке
Я создал парсер в Sprache и C# для файлов, использующих формат, который я не контролирую. С его помощью я могу правильно конвертировать:
a = "my string";
в
my string
Парсер (только для цитируемого текста) в настоящее время выглядит так:
public static readonly Parser<string> QuotedText =
from open in Parse.Char('"').Token()
from content in Parse.CharExcept('"').Many().Text().Token()
from close in Parse.Char('"').Token()
select content;
Однако формат, с которым я работаю, экранирует кавычки, используя кавычки "двойные двойники", например:
a = "a ""string"".";
При попытке разобрать это ничего не возвращается. Должен вернуться:
a ""string"".
Дополнительно
a = "";
должен быть разобран в string.Empty
или похожие.
Я безуспешно пробовал регулярные выражения на основе таких ответов "(?:[^;])*"
, или же:
public static readonly Parser<string> QuotedText =
from content in Parse.Regex("""(?:[^;])*""").Token()
Это не работает (т.е. в вышеуказанных случаях совпадения не возвращаются). Я думаю, что мои навыки регулярных выражений мешают. У кого-нибудь есть намеки?
РЕДАКТИРОВАТЬ: я тестировал здесь - http://regex101.com/r/eJ9aH1
4 ответа
Если я вас правильно понимаю, это то тип регулярного выражения, который вы ищете:
"(?:""|[^"])*"
Смотрите демо.
1. "
соответствует вводной цитате 2. (?:""|[^"])*
соответствует двум кавычкам или любым символам, которые не являются кавычками (включая переводы строк), повторяя 3. "
соответствует закрывающей цитате
Но это всегда сводится к тому, сбалансирован ли ваш вклад. Если нет, вы будете получать ложные срабатывания. И если у вас есть строка, такая как "string"", which should be matched?
"Строка"",
"" или ничего?... Это сложное решение, которое, к счастью, вам не нужно принимать, если вы уверены в своем мнении.
Скорее всего, вы можете адаптировать желаемый результат из этого шаблона:
"(.+".+")"|(".+?")|("")
пример:
Это регулярное выражение "("+)
может помочь вам найти дополнительные нежелательные двойные кавычки.
вот ДЕМО