【问题标题】:Evaluating inline C# code from post content从帖子内容评估内联 C# 代码
【发布时间】:2015-08-11 14:34:10
【问题描述】:

我一直在这个圈子里转圈,需要一些帮助。我有一个评估代码的方法,所以如果我通过这个 Eval("DateTime.Now.Year - 1986") 它返回 29,它工作得很好,这意味着我可以在我的帖子中包含在运行时动态评估的内联代码(这可能会带来一些安全问题,但是对于其他时间),这是我尝试使用的示例字符串:string inStr = "this year is [EVAL]DateTime.Now.Year[/EVAL] and it has been [EVAL]DateTime.Now.Year - 1986[/EVAL] years since 1986"; 我需要一个正则表达式,它将替换所有 [EVAL] 实例并返回带有评估结果的全文。有人吗?

【问题讨论】:

  • 你知道你可以简单地IndexOf("[EVAL]") 而不用对抗正则表达式吗?
  • @Zaki:我认为他们要求不要仅删除“[EVAL]”标记,还要求替换/评估这些标志中的表达式。编辑:也就是说,他们有评估代码,所以他们只需要 extract 表达式。
  • 您可以尝试string.Split() 沿着"[EVAL]""[/EVAL]" 边界,存储到一个自定义数据结构中,该结构基本上包含两个列表。文字字符串之一,以及可评估字符串之一。然后评估它们并从列表中重新构建结果字符串。
  • 附带说明一下,您是否考虑过使用为此目的而设计的技术?例如,如果您将帖子保存为 Razor 页面,则可以使用 @DateTime.Now.Year 语法。
  • (\[(EVAL)\]){1}([\w\.\d\s\-]+)\[\/(EVAL){1}\] 为您的示例字符串提供了两个匹配项。

标签: c# asp.net regex


【解决方案1】:

你想要一个正则表达式,你可以有一个正则表达式......

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]

【讨论】:

  • 这行得通,仍然需要使用更复杂的 [EVAL] 进行测试,但是如何在没有单独的 RegexReplacer 的情况下在一行中获得返回 return rx.Replace(inStr, RegexReplacer);
  • @NelsonPires 最小值类似于:string outStr = rx.Replace(inStr, match => Eval(match.Groups[2].Value))
  • 太棒了,谢谢,它工作得很好,我的系统的可能性刚刚大大打开。再次感谢。
猜你喜欢
  • 2011-06-13
  • 2013-11-09
  • 2018-10-23
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 2016-11-05
  • 2010-09-10
  • 2017-04-27
相关资源
最近更新 更多