Регулярное выражение для игнорирования последовательных кавычек в строке

Я создал парсер в 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?"Строка"","" или ничего?... Это сложное решение, которое, к счастью, вам не нужно принимать, если вы уверены в своем мнении.

Скорее всего, вы можете адаптировать желаемый результат из этого шаблона:

"(.+".+")"|(".+?")|("")

пример:

http://regex101.com/r/lO1vZ4

Если вы хотите игнорировать только двойные кавычки, попробуйте это:

("{2,})

Живая демо

Это регулярное выражение "("+) может помочь вам найти дополнительные нежелательные двойные кавычки.

вот ДЕМО

Другие вопросы по тегам