2013-06-22 3 views
0

У меня есть приложение, в котором пользователи настраивают кучу объектов, заполняя кучу текстовых полей, которые представляют значения, которые будут принимать эти объекты. Также как создание объекта Person, в котором вам необходимо ввести Name и LastName.Набор правил для замены простых строк

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

Например, скажем, что у меня есть глобальная переменная, называемая McThing. Затем, скажем, символ, который я выбираю для обозначения начала переменной, - %. Затем пользователь сможет ввести в качестве фамилии человека строку «Mc.% McThing», которую я заменил бы с использованием значения McThing. Если значение McThing - «Donalds», фамилия станет «Mc. Donalds».

Проблема в том, что если бы у меня была переменная, называемая He, а другая - Hello, а пользователь вводил «% Hello» в качестве строки, я бы не знал, какую переменную нужно заменить. Я могу изменить свои правила, например, использовать символ «%», чтобы отметить как начало, так и конец имени переменной. Но я не уверен, приведет ли это к какой-либо другой проблеме.

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

+1

'Mc. % (McThing) ' –

ответ

0

Ваш подход к маркировке как начала, так и конца с % имеет одну проблему. Что произойдет, если входная строка %foo%%bar%? Получаю ли значение foo и значение bar? Или я получаю значение foo%bar? (Конечно, если % в именах переменных не допускается, это не проблема.)

Самый простой способ, который я могу придумать, чтобы избежать этой проблемы, - использовать один символ для начала и другого (например, #) для конца. Это должно избегать любой двусмысленности. Если пользователю требуется # в тексте или имени переменной, он избегает его так: %#. Это не вызывает проблем, так как пустые имена переменных - это не вещь (по крайней мере, я надеюсь, что нет).

0

Это будет хорошо и легко реализовать на предположении, что:

  • У вас нет пустых имен переменных (то есть, если мы видим %% является то, что % или пустое имя переменной?)
  • имена переменных не могут содержать % с (то есть, если мы видим % в имени переменной, является то, что конец или %?)
    иЛИ
    имена переменных не могут начинаться или конец с %и вы не можете иметь 2 имени переменных в строке
    (т. is %a%%b% = a и b или a%b?)

Эти предположения гарантируют, что любой %% всегда представляет % характер, и любой % всегда представляет собой начало или конец строки.

Эти предположения могут не обязательно быть обязательными, но по крайней мере они сделают реализацию намного сложнее (с приведенными выше предположениями нам никогда не придется смотреть более 1 символа вперед).

Альтернатива без таких ограничений, свободно основанная на способе C/Java/etc. делает это:

Есть % взять на себя роль, похожую на \ в C/Java/etc. - использование:

  • %s, чтобы обозначить начало строки
  • %e, чтобы обозначить конец строки
  • %% для обозначения % характера

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