在这个问题中,我询问了有关支持表达式语言的问题,并成功使用了 Javascript 思想将简单的表达式语言放入 java
但是所需的 Javascript 表达式已经变得非常冗长,我试图弄清楚如何使用 ScriptEngine 创建可以在我的表达式中引用的 javascript 函数,以便表达式可以更短。
到目前为止,我已经通过在用户输入的字符串上使用 reexp 破解了一个解决方案,该字符串可以包含一个名为 ifempty 的伪函数,然后我在传递给脚本引擎之前将其转换为 javascript
public final String formatFromMask(String mask,Song exampleSong)
{
mask = convertPsuedoFunctions(mask);
try
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
for(SongFieldName next:SongFieldName.values())
{
engine.put(next.getScriptVar(),exampleSong.getFieldValueOrEmptyString(next.getSongFieldKey()));
}
Object result = engine.eval(mask);
return (String)result;
}
catch(ScriptException se)
{
se.printStackTrace();
}
return "";
}
private String convertPsuedoFunctions(String mask)
{
//i.e ifnotempty(artist,' - ') -> (artist.length>0 ? artist + ' - ' : '')
mask=mask.replaceAll("ifnotempty\\(([a-z]*)\\,('.*')\\)",
"($1.length>0 ? $1 + $2 : '')");
return mask;
}
它可以解析一个表达式,例如
ifnotempty(album,'/')
+ ifnotempty(artist,' - ')
+ ifnotempty(album,' - ')
+ ifnotempty(track,' - ')
+ ifnotempty(title,'')
但我想知道一个合适的解决方案,我实际上创建了一个真正的 javascript 函数。