c # разобрать строку, содержащую условия, ключ = значение - PullRequest
1 голос
/ 28 июня 2010

Я даю строку, которая содержит несколько различных комбинаций данных.

Например:

строковые данные = "(возраст = 20 лет и пол = мужчина) или (город = Нью-Йорк)"
строка data1 = "(работа = инженер и пол = женщина)"
строка data2 = "(foo = 1 или foo = 2) & (bar = 1)"

Мне нужно проанализировать эту строку и создать из нее структуру, и я должен оценить ее для состояния другого объекта. Например: если объект обладает этими свойствами, то что-то сделать, иначе пропустить и т. д.

Каковы наилучшие методы для этого?

Должен ли я использовать такой синтаксический анализатор, как antlr, и генерировать токены из строки. etc.?

напоминание: существует несколько комбинаций того, как создается эта строка. но это все и / или.

Ответы [ 5 ]

2 голосов
/ 28 июня 2010

Что-то вроде ANTLR, вероятно, излишне для этого.

Простая реализация алгоритма маневрового двора , вероятно, неплохо бы справилась.

1 голос
/ 28 июня 2010

Использование регулярных выражений может работать, если пример очень простой, но, скорее всего, приведет к коду, который невозможно поддерживать. Использование какого-то другого подхода к синтаксическому анализу кажется хорошей идеей.

  • Я бы взглянул на NCalc - он в основном сфокусирован на синтаксическом анализе математических выражений, но кажется, что он вполне настраиваемый (вы можете указать свои функции и константы), поэтому он может работать в вашем сценарии.

  • Если это слишком сложно для вашей цели, вы можете использовать любой «генератор парсера» для C #. Использование ANTLR является отличным вариантом - вот пример, который показывает, как начать писать что-то вроде вашего примера Пятиминутное введение в ANTLR

  • Вы также можете попробовать использовать F #, который является отличным языком для такого рода проблем. См., Например, Пример FsLex Криса Смита, который показывает простой математический оценщик - обработка разобранного выражения в F # будет намного проще, чем в C #. В F # вы также можете использовать FParsec , который очень легкий, но может быть немного сложным, если вы не привыкли к F #.

0 голосов
/ 28 июня 2010

Предлагаю взглянуть на регулярные выражения: http://www.codeproject.com/KB/dotnet/regextutorial.aspx

0 голосов
/ 28 июня 2010

Antlr - отличный инструмент, но вы, вероятно, можете сделать это с помощью регулярных выражений.Одна из приятных сторон движка .NET - поддержка вложенных конструкций.См.

http://retkomma.wordpress.com/2007/10/30/nested-regular-expressions-explained/

и этого ТАК сообщения .

0 голосов
/ 28 июня 2010

Похоже, вы можете использовать регулярные выражения для этого.

Прочтите немного о регулярных выражениях в .NET.Вот несколько хороших статей:

Когда придет время написать / протестировать ваше регулярное выражение, я настоятельно рекомендую использовать regex tester от RegExLib.com .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...