gpt4 book ai didi

c# - 如果模板中的最后一个字符是 $,NVelocity 合并将失败

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:40 26 4
gpt4 key购买 nike

我在使用 CaSTLe NVelocity 时遇到了一个奇怪的问题...

如果模板字符串以 $ 字符结尾,它会抛出以下异常:

Lexical error: NVelocity.Runtime.Parser.TokenMgrError: Lexical error at line 1, column 94. Encountered: after : ""

如果我在字符串末尾添加一个空格或任何其他字符,它会按预期工作。

有人对此有解决方法吗?

下面是一些重现该问题的示例代码:

class Program
{
static void Main(string[] args)
{
var result = Merge("The quick brown ${Animal} jumps over the lazy dog$", new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("Animal", "fox") });

Console.WriteLine("Success: {0}", result.Key);
Console.WriteLine("Message: {0}", result.Value);
Console.Read();
}

public static KeyValuePair<bool, string> Merge(string template, IList<KeyValuePair<string, string>> data)
{
var ret = new KeyValuePair<bool, string>(false, null);
try
{
if (data != null)
{
var engine = new VelocityEngine();
engine.Init();

var context = new VelocityContext();
foreach (var tokenData in data)
{
context.Put(tokenData.Key, tokenData.Value);
}

var templateContent = template;

var sb = new StringBuilder();
var textWriter = new StringWriter(sb);

engine.Evaluate(context, textWriter, String.Empty, templateContent);

ret = new KeyValuePair<bool, string>(true, sb.ToString());
}
}
catch (Exception ex)
{
ret = new KeyValuePair<bool, string>(false, ex.Message);
}
return ret;
}
}

最佳答案

你有几个选择:

如果您对要合并的输入字符串没有影响,请确保它们没有尾随美元字符,至少对于合并过程而言:

例子:

bool dollarAtEnd = false;

if (input.EndsWith('$'))
{
input += " ";
dollarAtEnd = true;
}

var result = Merge(input, ...);

if (dollarAtEnd)
{
result = result.Substring(1, result.Length - 1);
}

如果你可以控制输入的字符串,但只要求其中部分字符串以美元字符结尾,你可以这样做:

例子:

"#set($dollar='$')The quick brown ${Animal} jumps over the lazy dog$dollar"

或者将“dollar”作为变量传递给 VelocityContext,而不是直接指定它。

关于c# - 如果模板中的最后一个字符是 $,NVelocity 合并将失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com