как получить строку с регулярным выражением и набором элементов

У меня есть набор элементов, которые я хочу поместить в строку, но я не знаю порядок или правильный формат, и я разрешаю «пользователю» определить эту конфигурацию, затем я хочу проанализировать это выражение и вернуть строку дан набор предметов.

Примеры...

учитывая набор элементов [a1, a2, a3, a4] и некоторые выражения

"Printing items: (item)[0] (, item)[2,n-1] and (item)[n]" 

производит

"Printing items: a1, a2, a3 and a4"

Другой пример:

"Another way: we have (item)[0] and {n-1} others (</br> item)[2,n-1] </br> and (item)[n]"

результаты

Another way: we have a1 and 3 others 
a2
a3
and a4.

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

Спасибо.


person k-dev    schedule 27.01.2011    source источник


Ответы (3)


Типичный синтаксический анализ строки.

Я бы сказал, удалите ссылку на элемент, если у вас нет нескольких списков. Затем добавьте escape-символ.

Элементы печати: # элемент # 0 #, # элемент # 2,% n-1%, "," # и # элемент #% n% #

Другой способ: у нас есть # item # 0 # и% n-1% others # item # 2,% n-1%, "" # и # item #% n% #

Это было бы намного проще разобрать.

Все, что находится между%, является расчетом, # обозначает ссылку. Если ссылка на список, второй # и третий # включают индекс. Запятая указывает диапазон. Вторая запятая указывает на разделительный знак.

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

Найдите свой escape-символ, если это ссылка на массив, посмотрите, есть ли больше этого escape-символа, если вы найдете запятую перед 3-м escape-символом, у вас есть диапазон, вторая запятая и разделитель элементов .

Тогда вы можете просто токенизировать строку вместо того, чтобы интерпретировать фигурные скобки.

person Lee Louviere    schedule 27.01.2011
comment
Мне нравится ваша идея # для упрощения, но мне потребовалось время, чтобы понять ее, кажется, менее читабельной. Также вы включаете разделитель в качестве третьего аргумента, но он не является разделителем. То, что я помещаю внутри (), больше похоже на шаблон. Учитывая ваш ответ, мне кажется, мне нужно создать свой собственный парсер ... - person k-dev; 28.01.2011

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

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

1) Самое простое и наименее гибкое решение - использовать string.Format (). Это позволит пользователям решать, какие элементы отображать и в каком порядке, но требует, чтобы пользователь ссылался на каждое значение по индексу, а не по имени, и не может обрабатывать произвольные наборы данных. Также вам нужно будет обработать FormatException, если пользователь попытается сослаться на несуществующее значение.

2) Другая возможность - создать данные в стабильном формате xml и позволить пользователю предоставить xslt. Это лучше всего работает для небольшого количества больших выходных данных, поскольку xslt может быть немного длинным для большого количества простых выходных данных. Пространство имен System.Xml.Xsl, кажется, предоставляет механизм Xslt, но я никогда не пытался его использовать.

3) Вы можете использовать механизм шаблонов .NET. есть еще один вопрос SO относительно движков шаблонов в .NET, но я сам никогда не использовал их.

Можете ли вы порекомендовать механизм шаблонов .net?

person Brian Reichle    schedule 28.01.2011
comment
@ brian-reichle, это идея, но string.format и xslt не могут использоваться по причинам, которые вы указали, похоже, механизмы шаблонов ориентированы на asp.net. Я хочу использовать его для печати списка объектов на разных языках с разным форматированием. - person k-dev; 28.01.2011

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

    Console.writeLine(messageToBePrinted);   
for(int i = 0;i<array.size;i++)  
{
  if(i == array.size -1){
    Console.writeLine(endFormat);  
 }
  else{
  Console.writeLine(normalFormat);  
 }
  Console.writeLine(array[i]);  
}
person Woot4Moo    schedule 27.01.2011