RegEx для String.Format - PullRequest
       32

RegEx для String.Format

0 голосов
/ 29 октября 2009

Привет всем! :)

У меня есть приложение, в котором пользователь может вставить строку в текстовое поле, которое позже будет использовано для вывода в виде String.Format. Таким образом, ввод пользователя должен иметь определенный формат:

Я хотел бы заменить ровно один заполнитель, поэтому строка должна иметь такую ​​форму: «Текст {0} Текст». Таким образом, он должен содержать хотя бы один '{0}', но не должен содержать никаких других операторов между фигурными скобками, например, нет {1}.

Для текста до и после '{0}' я бы разрешил любые символы.

Так что я думаю, я должен соблюдать следующие ограничения: {должно быть написано как {{,} должно быть написано как}}, "должно быть написано как \" и \ должно быть написано как \.

Может кто-нибудь сказать мне, как я могу написать такой RegEx? В частности, могу ли я сделать что-то вроде «любой символ БЕЗ», чтобы исключить четыре символа ({,}, «и \) выше вместо перечисления всех разрешенных символов?

Большое спасибо !! Nikki:)

Ответы [ 5 ]

6 голосов
/ 29 октября 2009

Я не хочу быть парнем, который не отвечает на вопрос, но на самом деле это плохое удобство использования, чтобы попросить вашего пользователя отформатировать ввод для работы с String.Format. Предоставьте им два запроса ввода, чтобы они вводили деталь перед {0} и деталь после {0}. Тогда вам нужно просто объединить строки вместо использования String.Format. Использование String.Format для предоставленного пользователем текста - просто плохая идея.

1 голос
/ 29 октября 2009

Я думаю, что на ваш вопрос можно ответить с помощью регулярного выражения:

^(((\{\{|\}\}|\\"|\\\\|[^\{\}\"\\])*(\{0\}))+(\{\{|\}\}|\\"|\\\\|[^\{\}\"\\])*$

Пояснение:

Выражение построено следующим образом:

^(allowed chars {0})+(allowed chars)*$

одна или несколько последовательностей разрешенных символов с последующим {0} с необязательными разрешенными символами в конце.

Разрешенные символы построены из 4 упомянутых вами последовательностей (я предположил, что \ escape - \\ вместо \.) Плюс все символы, которые не содержат символы escape-символов:

(\{\{|\}\}|\\"|\\\\|[^\{\}\"\\])

вместе они составляют регулярное выражение, с которого я начал.

1 голос
/ 29 октября 2009
[^(){}\r\n]+\{0}[^(){}\r\n]+

будет соответствовать любому тексту, кроме (,), {,} и переносам строк, затем совпадать с {0}, затем так же, как и раньше Должен быть хотя бы один символ до и после {0}; если вы этого не хотите, замените + на *.

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

^[^(){}\r\n]+\{0}[^(){}\r\n]+$
1 голос
/ 29 октября 2009

(аналогично ответу Тима)

Что-то вроде:

^[^{}()]*(\{0})[^{}()]*$

Протестировано на http://www.regular -expressions.info / javascriptexample.html

1 голос
/ 29 октября 2009

Звучит так, будто вы ищете конструкцию [^CHARS_GO_HERE]. Точное регулярное выражение, которое вам понадобится, зависит от вашего движка регулярных выражений, но оно будет напоминать [^({})].

Ознакомьтесь с разделом «Классы отрицательных символов» на странице Класс символов на Regular-Expressions.info .

...