我正试图将这个答案适应regexp替换的情况:
<scriptdef name="propertyregex" language="javascript">
<attribute name="property"/>
<attribute name="input"/>
<attribute name="regexp"/>
<attribute name="replace"/>
<![CDATA[
var input = attributes.get("input");
var regex = new RegExp(attributes.get("regexp"));
var replace = attributes.get("replace");
var res = input.replace(regex, replace);
project.setProperty(attributes.get("property"), res);
]]>
</scriptdef>
然而,在执行该代码时,我总是会遇到一个异常:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException:
The choice of Java constructor replace matching JavaScript argument types
(function,java.lang.String) is ambiguous; candidate constructors are:
class java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence)
class java.lang.String replace(char,char)
如何在这里进行正则表达式替换?
问题似乎是此变量input
属于Java类型java.lang.String
,显然不是Rhino的原生String类型。您可以通过显式地构建一个JavaScript字符串来避免这个问题:
var input = new String(attributes.get("input"));
我在Alfresco论坛上找到了另一个答案。
问题是,当解释JS代码时,无法确定input
的类型。它可以是java.lang.String
或Javascript的string
。论坛上的提议对我来说很有效——只是把input
对象"投射"到JS string
上,如下所示:
var res = (input + "").replace(regex, replace);
注意:我刚刚用空字符串连接了输入。
希望这能有所帮助。