2015-08-11 2 views
0

Я был в кругах с этим и нуждался в некоторой помощи. У меня есть метод, который оценивает код, поэтому, если я передаю этот Eval("DateTime.Now.Year - 1986"), он вернет 29, он отлично работает, и это означает, что я могу иметь встроенный код в своих сообщениях, которые динамически оцениваются во время выполнения (это может представлять некоторые проблемы безопасности, но для некоторых других time), вот пример строки, с которой я пытаюсь работать: string inStr = "this year is [EVAL]DateTime.Now.Year[/EVAL] and it has been [EVAL]DateTime.Now.Year - 1986[/EVAL] years since 1986"; Мне нужно регулярное выражение, которое заменит все экземпляры [EVAL] и вернет полный текст с оцененными результатами. Кто угодно?Оценка встроенного кода C# из сообщения

+2

Вы знаете, что можете просто 'IndexOf (" [EVAL] ")' не бороться с регулярными выражениями? – xanatos

+0

@ Zaki: Я думаю, что они просят не отменять только те же «[EVAL]», но также и _replace/evaluation_ выражения внутри этих флагов. EDIT: то есть, у них есть оценочный код, поэтому им нужно только вывести выражения. –

+1

Вы можете попробовать 'string.Split()' вдоль '" [EVAL] "и' "[/ EVAL]" 'границы, сохраняя в пользовательскую структуру данных, которая по существу обертывает два списка. Одна из буквенных строк и одна из строк, способных оценивать. Затем оцените их и заново постройте результирующую строку из списков. – David

ответ

1

Вы хотите Regex, вы можете иметь регулярное выражение ...

string inStr = "this year is [EVAL]DateTime.Now.Year[/EVAL] and it has been [EVAL]DateTime.Now.Year - 1986[/EVAL] years since 1986"; 

var rx = new Regex(@"(\[EVAL\])(.*?)(\[/EVAL])"); 

string outStr = rx.Replace(inStr, RegexReplacer); 

с

public static string RegexReplacer(Match match) 
{ 
    return Eval(match.Groups[2].Value); 
} 

или в зависимости от типа возвращаемого Eval:

public static string RegexReplacer(Match match) 
{ 
    object obj = Eval(match.Groups[2].Value); 
    return obj != null ? obj.ToString() : string.Empty; 
} 

захвате группа № 2 - (.*?). Обратите внимание на использование ленивого квантификатора .*?, поскольку в противном случае захват будет [EVAL]DateTime.Now.Year[/EVAL] and it has been [EVAL]DateTime.Now.Year - 1986[/EVAL]

+0

Гораздо короче, чем тот, с которым я столкнулся ... –

+0

Это сработало, все еще нужно тестировать с более сложными [EVAL] s, но как я могу получить возврат в одной строке 'return rx.Replace (inStr, RegexReplacer);' без отдельного RegexReplacer? –

+0

@NelsonPires Минимальное значение похоже на: 'string outStr = rx.Replace (inStr, match => Eval (match.Groups [2] .Value))' – xanatos

Смежные вопросы