Разбор текста, условный текст

У меня есть текстовый шаблон с заполнителями, которые я анализирую, чтобы заменить заполнители реальными значениями.

Текстовый шаблон:

Name:%name%
Age:%age%

Я использую StringBuilder.Replace() для замены заполнителей

sb.Replace("%name%", Person.Name);

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

Текстовый шаблон

Name:%Name%
Age:%age%
Employer:%employer%

Строка Employer должна появляться только тогда, когда человек работает (управляется логической переменной Person.IsEmployed).

ОБНОВЛЕНИЕ: я мог бы использовать открывающие/закрывающие теги. Как найти текст между строками A и B? Могу ли я использовать регулярное выражение? Как?


person Captain Comic    schedule 07.03.2010    source источник


Ответы (4)


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

Name:%Name%
Age:%age%
[if IsEmployed]
Employer:%employer%
[/if]

Вы можете разобрать блоки [if *] с помощью регулярного выражения (не проверено):

Match[] ifblocks = Regex.Match(input, "\\[if ([a-zA-Z0-9]+)\\]([^\\[]*)\\[/if\\]");
foreach(Match m in ifblocks) {
    string originalBlockText = m.Groups[0];
    string propertyToCheck = m.Groups[1];
    string templateString = m.Groups[2];

    // check the property that corresponds to the keyword, i.e. "IsEmployed"

    // if it's true, do the normal replacement on the templateString
    // and then replace the originalBlockText with the "filled" templateString

    // else, just don't write anything out
}

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

person Jeff Meatball Yang    schedule 07.03.2010

Возможно, вы могли бы включить метку «Работодатель:» в замещающий текст вместо шаблона:

Шаблон:

Name:%Name%
Age:%age%
%employer%

Замена

sb.Replace("%employer%", 
    string.IsNullOrEmpty(Person.Employer) ? "" : "Employer: " + Person.Employer)
person Fredrik Mörk    schedule 07.03.2010
comment
Как я могу установить, что метка относится только к определенной области текста? Я думаю, мне нужно ввести открывающие/закрывающие теги. - person Captain Comic; 07.03.2010


Одним из вариантов было бы выполнить все ваши замены, как вы делаете сейчас, а затем исправить пустые переменные с заменой RegEx на выходе. Что-то вроде этого:

Response.Write(RegEx.Replace(sb.ToString(), "\r\n[^:]+:r\n", "\r\n"));
person richardtallent    schedule 07.03.2010