调用string上的replace会抛出EvaluatorException

MvG*_*MvG 7 javascript java regex ant rhino

我正在尝试将此答案适用于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>
Run Code Online (Sandbox Code Playgroud)

但是,执行该代码我总是得到一个例外:

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)
Run Code Online (Sandbox Code Playgroud)

我怎样才能在这里做正则表达式替换?

MvG*_*MvG 6

问题似乎是这个变量input属于Java类型java.lang.String,显然不是Rhino的本机String类型.您可以通过明确构建JavaScript字符串来避免此问题:

       var input = new String(attributes.get("input"));
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你评估`typeof(attributes.get("input"))`你会得到``object``.更简单地说,`String(attributes.get("input"));`也可以.请注意,在Nashorn中,JDK 8 JavaScript实现,本机`java.lang.String`在JavaScript端被视为字符串. (3认同)

小智 5

我在Alfresco论坛上找到了另一个答案。

问题是,当解释JS代码时,input不能确定类型。可以是java.lang.StringJavascript的string。论坛的建议对我有用-只是将input对象“投射” 到JS,string如下所示:

 var res = (input + "").replace(regex, replace);
Run Code Online (Sandbox Code Playgroud)

注意:我刚刚将输入与空字符串连接在一起。

希望这可以帮助。