Java 为什么带有自定义分隔符的StringTemplates不起作用?

Java 为什么带有自定义分隔符的StringTemplates不起作用?,java,template-engine,stringtemplate,Java,Template Engine,Stringtemplate,我正在尝试使用带有自定义分隔符的字符串模板 此代码段: new ST("Hello @what@", '@', '@').add("what", "world").render() 抛出org.stringtemplate.v4.compiler.STException,所以我显然做错了 如果我将其更改为new ST(“Hello$what$”、“$”、“$”),它会工作。为什么@不起作用 编辑-除了$和@之外,我还尝试了其他字符,到目前为止,除了$之外,其他字符都不起作用。发生了什么事?我认

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

此代码段:

new ST("Hello @what@", '@', '@').add("what", "world").render()
抛出org.stringtemplate.v4.compiler.STException,所以我显然做错了

如果我将其更改为
new ST(“Hello$what$”、“$”、“$”)
,它会工作。为什么
@
不起作用


编辑-除了
$
@
之外,我还尝试了其他字符,到目前为止,除了
$
之外,其他字符都不起作用。发生了什么事?

我认为他们必须是不同的角色;启动/停止。
Ter

像“$”这样的字符,“什么版本?”?你能复制一下堆栈跟踪吗?并包括一个SSCCE()。@I825最新版本。。。4.0.2 ... 奇怪的是,我认为上面的例子是SSCCE。它不会繁殖吗?如果不是,我可以准备一个更完整的例子。如果是这样的话,如果它们不相同,构造函数不应该抛出非法参数异常吗?从ASCII范围0x21..0x7E,以下字符可以用作开始和结束分隔符:
>?\^`}~\$%*+-
(其他人,
!”&(),./:;=@[]{u124; a..z a..z 0..9
,无法)@BartKiers将此作为答案发布-这应该是公认的答案。您在哪里找到此信息?谢谢!
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;
}