2009-10-29 10 views
0

Hiho все! :)RegEx для String.Format

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

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

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

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

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

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

ответ

1

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

Заканчивать раздел «Отрицаемые Классы символов» из Character Class page at Regular-Expressions.info.

+0

Ни один из символов '(', ')', '{' и '}' не имеет специального значения внутри символьного класса, поэтому '[^ \ (\ {\} \)]' может быть записано как ' [^ ({})] '. –

+0

Спасибо. Я соответствующим образом обновил этот пример. –

1
[^(){}\r\n]+\{0}[^(){}\r\n]+ 

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

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

^[^(){}\r\n]+\{0}[^(){}\r\n]+$ 
6

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

+0

good point Brian – toolkit

+0

Абсолютно! Если вы это сделаете, вам просто нужно проверить входные строки на '^ [^() {}) + $' (предполагая, что это единственные символы, которые могут нарушить ваше приложение). –

+0

Drat. Я имел в виду '^ [^() {}] + $'. Сожалею. –

1

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

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

Объяснение:

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

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

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

разрешены символы построен из 4-х последовательностей, которые вы упомянули (Я предположил \ побег \\ вместо \.), А также все символы, которые не содержат ускользает символы:

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

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

+0

Это регулярное выражение дает мне головную боль :( – Amarghosh

+0

отсюда объяснение того, как он строится :) – rsp