Потоковый структурированный ввод текста - PullRequest
2 голосов
/ 12 февраля 2010

Я бы хотел проанализировать отформатированные базовые значения и несколько пользовательских строк из TextReader - по существу, как scanf позволяет.

  • Мой ввод может не иметь разрывов строк, поэтому ReadLine + Regex не вариант. Я мог бы использовать какой-то другой способ ввода текста; но проблема в том, что я не знаю разделитель во время компиляции (так что это сложно), и что этот разделитель может зависеть от локализации. Например, число с плавающей запятой, за которым следует запятая, может быть «1,5» или «1,5», но в обоих случаях попытка разобрать число с плавающей точкой должна быть «жадной».
  • Чтобы быть в безопасности, я хотел бы предположить, что мой ввод активно враждебен (скажем, потоковая передача из сетевого потока): т. Е. Преднамеренно отсутствует разделитель чанков.
  • Я бы хотел избежать пользовательских Regex: int.Parse и double.Parse работают хорошо и учитывают локализацию. Не начинайте меня с DateTime - мне все равно может понадобиться несколько пользовательских шаблонов, но написание регулярных выражений для освещения этого сценария не выглядит забавным.

Для конкретного примера, скажем, у меня есть TextReader, и я знаю, что следующим значением должно быть double - как я могу извлечь это двойное и, возможно, ограниченное количество просмотров, не читая весь поток и без вручную писать локализуемый двойной парсер?

Похожие вопросы

Есть предыдущий вопрос " Ищите эквивалент C # scanf", который звучит похоже, но Q + A фокусируется на readline + regex (которого я хотел бы избежать). Как я могу использовать Regex против TextReader? не нашел ответа (кроме фрагментирования), и в любом случае я бы хотел избежать написания своих собственных регулярных выражений.

1 Ответ

1 голос
/ 01 марта 2010

Судя по тому, что у меня нет ответов и я ничего не нашел, кажется,

  • Нет средств для использования локализованного синтаксического анализа непосредственно из Streams (или TextReaders) в .NET, а также нет способа узнать, какая часть потока систематически соответствует анализируемому префиксу.
  • Нет средств для применения регулярных выражений к Streams (или TextReaders) в .NET, поэтому нет простого способа реализовать что-то подобное самостоятельно.
  • Если вам действительно нужно что-то подобное, самый простой вариант - полноценный генератор парсеров. ANTLR хорошо работает для этого; у него есть много существующих грамматик, которые вы можете копировать-вставить для основ, и он поставляется с графическим интерфейсом, чтобы помочь понять вашу грамматику и делает парсеры для .NET, java, C и множества других языков. Он удобен для разработчиков, быстр ... ... но слишком мощный и гибкий для того, что мне нужно; как стрелять в жука из дробовика - я не в восторге от этого решения.
...