Хорошая практика для анализа пользовательских входов с помощью специальных символов? - PullRequest
8 голосов
/ 28 февраля 2011

Привет, я - автор программы восстания против злой галактической империи. Прямо сейчас мы готовимся к дерзкому нападению на Звезду Смерти.

Я создал обширную базу данных о наших пилотах, дроидах и системах на борту наших истребителей X-Wing и Y-Wing, которые вскоре атакуют Звезду Смерти. Ввиду наших критических потребностей в быстром доступе к информации я разработал систему, в которой пользователь может ввести строку текста, чтобы указать, какие данные он хочет получить.

Существует множество полей, по которым пользователь может искать. Например, если пользователь хочет найти данные о R2D2, он может ввести запрос «DROID: R2D2» и быстро найти эти данные. Если ему нужны данные обо всех пилотах, дроидах и системах для Red Team, он может ввести «КОМАНДА: КРАСНАЯ КОМАНДА».

Однако система предназначена для обработки более сложных запросов. Как видно из предыдущего запроса, имя поля данных и значение данных разделяются двоеточием :. Пользователи должны иметь возможность поиска по нескольким значениям для каждого поля и поиска по нескольким полям одновременно.

Вот запрос, типичный для моих более продвинутых пользователей: "SHIPTYPE: X-WING, Y-WING; РАСПОЛОЖЕНИЕ: стыковочный отсек 94; DROIDTYPE: R2"

Я вполне доволен тем, как я справился с этим. Я использую функцию String.Split(';') для чтения, чтобы получить значения трех полей данных, выбранных пользователем. Я использую String.Split(':') to seperate the data field name from the value, and then I user String.Split (',') `, чтобы получить различные значения поля, где пользователь ввел более одного. Вы можете увидеть, как это работает.

Однако есть одна проблема. Принцесса Лея (вы знаете, какая она суетливая) настаивает на использовании «:», «;» и «,» в своих записях калибровки бластера. Когда она пытается запросить эти данные, ее запросы не понятны моей программе. Она говорит, что Звезда Смерти скоро уничтожит базу повстанцев, если эту проблему не исправить.

Поэтому, я прошу вас помочь в предложении хороших методов анализа пользовательских входных данных. Как мне заставить мою программу работать на принцессу Лею?

Обновление Я буду размышлять об ответе на свой вопрос. Когда я научился программировать на языках с C-языком, я узнал о «escape-последовательностях», где я могу указать обычно зарезервированный символ в своих строковых литералах. (например, «символ обычно завершает строковый литерал, но я могу« избежать »его, используя \») Я предполагаю, что было бы неплохо сделать что-то похожее с моей программой, но я не знаю, что бы быть лучшим способом достижения этого. До подготовки к этому нападению на «Звезду Смерти» большая часть моего опыта программирования была связана с бинарным языком испарителей влаги, поэтому для меня это ново.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2011

Подобно Google, вы можете разрешить указывать поисковые термины в «метках». Поэтому вы можете:

SHIPTYPE: «BATTLESTAR: GALACTICA»; МЕСТО: стыковочный отсек 94; DROIDTYPE:R2

2 голосов
/ 28 февраля 2011

Похоже, что вы используете ключевые слова в левой части разделителя и фактическое значение запроса в правой части разделителя. Вы можете попробовать кое-что, чтобы проверить, является ли word, заключенное между ; и :, фактическим ключевым словом и не игнорирует ли разделитель в этой точке.

Однако это будет не просто, и не будет работать только с String.Split()

2 голосов
/ 28 февраля 2011

Извините, но описание «Звездных войн» не помогло прояснить ваш вопрос.

Во всяком случае, я написал много кода для разбора. Меня не волнует String.Split(), если только данные не будут всегда отформатированы. Есть класс парсера общего назначения на http://www.blackbeltcoder.com/Articles/strings/a-text-parsing-helper-class. Я бы, вероятно, использовал что-то подобное для реализации более гибкого парсера.

...