对字符串调用replace将引发EvaluatorException

Calling replace on string throws EvaluatorException

本文关键字:EvaluatorException replace 字符串 调用      更新时间:2023-09-26

我正试图将这个答案适应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);

注意:我刚刚用空字符串连接了输入。

希望这能有所帮助。

相关文章:
  • 没有找到相关文章