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

1

Я создал парсер в 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

Теги:
sprache

4 ответа

2
Лучший ответ

Если я правильно понимаю вас, это регулярное выражение, которое вы ищете:

"(?:""|[^"])*"

См. Демонстрацию. 1. " соответствует котировке открытия 2. (?:""|[^"])* Соответствует двум кавычкам или любым символам, которые не являются котировками (включая новые строки), повторяя 3. " соответствует закрывающей кавычки.

Но всегда будет сводиться к тому, сбалансирован ли ваш вход. Если нет, вы получите ложные срабатывания. И если у вас есть строка, такая как "string"", which should be matched? "Строка" " , " "или ничего?... Это сложное решение, которое, к счастью, вам не нужно делать если вы уверены в своем вводе.

  • 0
    Спасибо - я могу с уверенностью предположить, что файлы, которые я получаю, являются сбалансированными входными данными, поскольку они проходят через процесс очистки, прежде чем я получу к ним. Я попробую это в C #.
1

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

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

пример:

http://regex101.com/r/lO1vZ4

  • 0
    Спасибо, похоже, это помогает, хотя @ zx81 ответил немного раньше, я отметил его как правильный.
  • 0
    @ Will-Hart, не беспокойтесь - рад, что вы нашли решение :)
0

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

вот ДЕМО

0

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

("{2,})

Демо-версия

  • 0
    Как видно из вашей демонстрации, это не игнорирует "" .
  • 0
    @AmalMurali Я обновляю свое регулярное выражение. Amal regex просто выбирает для вас подходящий шаблон, он не игнорирует, не заменяет и не делает ничего для вас. Чтобы изменить выбранную часть, вам нужно использовать метод, чтобы заменить то, что находится между круглыми скобками, на пустую строку
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню