Я создал парсер в Sprache и С# для файлов с использованием формата, который я не контролирую. Используя его, я могу правильно преобразовать:
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;
Однако формат, с которым я работаю, ускоряет кавычки с использованием котировок "double double", например:
a = "a ""string"".";
При попытке проанализировать это ничего не возвращается. Он должен вернуться:
a ""string"".
Дополнительно
a = "";
должен быть проанализирован в string.Empty
или аналогичный.
Я попытался неудачно регулярные выражения, основанные на ответах, как этого делать такие вещи, как "(?:[^;])*"
, Или:
public static readonly Parser<string> QuotedText =
from content in Parse.Regex("""(?:[^;])*""").Token()
Это не работает (т.е. в приведенных выше случаях не возвращаются совпадения). Я думаю, что у моих новичков навыки регулярного языка мешают. У кого-нибудь есть намеки?
EDIT: Я тестировал его здесь - http://regex101.com/r/eJ9aH1
Если я правильно понимаю вас, это регулярное выражение, которое вы ищете:
"(?:""|[^"])*"
См. Демонстрацию. 1. "
соответствует котировке открытия 2. (?:""|[^"])*
Соответствует двум кавычкам или любым символам, которые не являются котировками (включая новые строки), повторяя 3. "
соответствует закрывающей кавычки.
Но всегда будет сводиться к тому, сбалансирован ли ваш вход. Если нет, вы получите ложные срабатывания. И если у вас есть строка, такая как "string"", which should be matched?
"Строка" " ,
" "или ничего?... Это сложное решение, которое, к счастью, вам не нужно делать если вы уверены в своем вводе.
Вероятно, вы можете адаптировать желаемый результат из этого шаблона:
"(.+".+")"|(".+?")|("")
пример:
Это регулярное выражение "("+)
может помочь вам сопоставить дополнительные нежелательные двойные кавычки.
вот ДЕМО
Если вы хотите игнорировать последовательные двойные кавычки, попробуйте следующее:
("{2,})
""
.