【问题标题】:Why is this StringTemplates with custom delimiters not working?为什么这个带有自定义分隔符的 StringTemplates 不起作用?
【发布时间】:2012-01-07 08:55:42
【问题描述】:

我正在尝试使用带有自定义分隔符的字符串模板。

这段代码sn-p:

new ST("Hello @what@", '@', '@').add("what", "world").render()

抛出org.stringtemplate.v4.compiler.STException,所以我显然做错了。

如果我将其更改为new ST("Hello $what$", '$', '$'),它就可以工作。为什么@ 不起作用?

编辑 - 我尝试了除$@ 之外的其他字符,但到目前为止除了$ 什么都没有。怎么回事?

【问题讨论】:

  • 什么版本?你能重现堆栈跟踪吗?请附上 SSCCE (sscce.org)。
  • @I82Much 最新版本 ... 4.0.2 ... 奇怪,我认为上面的示例是 SSCCE。不会再生吗?如果没有,我可以准备一个更完整的例子。

标签: java template-engine stringtemplate


【解决方案1】:

我相信他们必须是不同的角色;开始/停止。 叔

【讨论】:

  • 如果是这样的话,如果它们不一样,构造函数不应该抛出非法参数异常吗?
  • 从 ASCII 范围 0x21..0x7E 开始,以下字符可以用作开始和结束分隔符:< > ? \ ^ ` } ~ # $ % ' * + -(其他字符,! " & ( ) , . / : ; = @ [ ] _ { | a..z A..Z 0..9,不能)
  • @BartKiers 将此作为答案发布 - 这应该是公认的答案。你在哪里找到这些信息的?谢谢!
【解决方案2】:

'$'、'

您可以制作一个转义工具,例如:

ST st = new ST(StringUtility.escapeStringTemplate(str));

//utility function

public static String escapeStringTemplate(String str){
    String result = str;
    if (result.contains("<")) {
        result = result.replace("<", "\\<");
    }
    if (result.contains("$")) {
        result = result.replace("$", "\\$");
    }

    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2012-03-06
    相关资源
    最近更新 更多