使用SSJS通过模式查找字符串中的项目

时间:2018-10-22 18:59:46

标签: regex xpages xpages-ssjs

我需要在XPages应用程序中支持多种语言。大多数文档使用以下模式存储某种形式的历史记录:作者-动词-主题-日期,例如“迈克尔·迈尔斯(Michael Myers)于1978年10月25日购买了一把刀。”

为了获得我的语言支持,我想设置翻译机制并翻译动词和主语。我考虑将字符串存储在属性文件中。

所以我想将历史记录存储在我的历史记录字段中: 迈克尔·迈尔斯(Michael Myers)1978年10月25日#买了@@ a刀@。

此字段是一个多值字段,因此输出将是一个向量,但我通过$ U.toArray()xsnippet函数将其转换为Array,因此可以在其上使用反向显示。

我想通过重复控件显示历史记录。看起来像这样:

<xp:repeat id="rptHistory" rows="1000" var="obj" indexVar="idx">
    <xp:this.value><![CDATA[#{javascript:var $U = {

  /* 
  /* function that always returns an array for the input value
   */
  toArray : function(input) {
    try {

      if (typeof input === "undefined" || input === null) {
        //return empty array
        return [];  
      }

      if (typeof input === "string") {
        //convert string to array (or empty array)
        return ( input.length > 0 ? [input] : [] );
      }

      if (typeof input === "java.util.Vector") {

        //Normally we would use toArray here, but this returns an Object array.
        //If you try to use that in a doc.replaceItemValue call, it fails.
        //sample code:
        //var v = getComponent("input1").getValue();    //returns a Vector if the component contains multiple values
        //v = $U.toArray(v)   //returns an array of Objects
        //doc.replaceItemValue("someOtherField", v);    //fails

        //the solution I used here is to create a JS array and copy the all the Vector's values
        var a = [];
        var it = input.iterator();
        while (it.hasNext() ) {
          a.push( it.next() );
        }
        return a;
      }

      if (typeof input.toArray !== "undefined") {
        return input.toArray();
      }

      if ( input.constructor === Array ) {
        //return input if it's already an array
        return input;
      } 

      //return input as an array
      return [ input ];

    } catch(e) {
      print("$U.toArray: " + e.toString());
    }
  }
}

var coll = compositeData.log;
if(compositeData.sort == "descending"){
    var result = $U.toArray(coll);
    uidArray = result;
    uidArray.reverse();
    uidReversed = uidArray;
    return uidReversed;
}else{
    return coll;
}


}]]></xp:this.value>
    <xp:panel tagName="div">
        <small>
            <xp:text escape="true"
                value="#{javascript:obj}" />
        </small>
    </xp:panel>
</xp:repeat>

在计算的文本控件中,我需要提供翻译。

有人猜出如何找到我要寻找的字符串吗?

我尝试设置一个正则表达式,但是不确定如何执行此操作

<xp:text escape="true">
                                <xp:this.value><![CDATA[#{javascript:var str = obj;
var regexp = new RegExp("^#.*#$");
return regexp.replace(str, "---")}]]></xp:this.value>
                            </xp:text>

1 个答案:

答案 0 :(得分:0)

我现在使用:

var str = obj;
var regexp = /\@(.*?)\@/;

var translations = regexp.exec(str);

if (null != translations){
    for (i = 0; i < translations.length; i++) { 
        if(null != regexp.exec(str)){
            trans = regexp.exec(str)[0];
            //verb first
            if (null != trans){
                str = regexp.replace(str, history[trans]);
            }
        }
    }
}
return str;

转换字符串按如下方式存储在属性文件中:

@verb_bought@=köpte
@subj_knife@=ett kniv

因此,1978年10月25日存储的字符串Michael Myers @ verb_bought @ @ subj_knife @在1978年10月25日成为Michael Myersköpteett kniv