骡子处理特殊字符

时间:2015-02-04 13:32:18

标签: mule

我正在编写一个MEL函数来处理JSON PAYLOAD中的特殊字符。我正在使用java.tex.Normalizer包,如下所示

import java.text.Normalizer;
def convertText(data){
    String temp = Normalizer.normalize(data, Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "");
    return temp;
}

DataMapper抱怨如下。与逃脱序列有关的事情

com.mulesoft.datamapper.transform.MelRecordTransform.transform(MelRecordTransform.java:53)
    at org.jetel.component.Reformat.execute(Reformat.java:271)
    ... 14 more
Caused by: [Error: illegal escape sequence: p]
[Near : {... NFD).replaceAll("[^\p{ASCII}]", ""); ....}]

1 个答案:

答案 0 :(得分:0)

您的示例代码在Groovy或MEL表达式组件中工作,但在DataMapper中不起作用。在处理MEL代码之前,DataMapper似乎进行了字符串文字转义处理。这意味着在MEL处理它之前,字符串中的每两个反斜杠将变为一个反斜杠。 MEL然后执行相同的操作并将每两个反斜杠处理为一个反斜杠。

这可能很棘手,因为你有三个级别在工作。

  1. DataMapper将Java转义规则应用于字符串。
  2. MEL将转义规则应用于字符串。
  3. replaceAll()将正则表达式转义规则应用于字符串。
  4. 由于你只需要2个反斜杠进入3级,那么你需要两倍的反斜杠数(即你经历了2级逃逸)。如果你输入四个反斜杠,它将正常工作。

    .replaceAll("[^\\\\p{ASCII}]", "");
    

    我通过将下面的字符串文字添加到DataMapper(没有replaceAll)并查看它转换它们的内容来验证这一点。

    "[^\\\\p{ASCII}]" converted to "[^\\p{ASCII}]"
    "[^\\p{ASCII}]" converted to "[^\p{ASCII}]"
    

    如果你真的想在单个文字反斜杠上匹配正则表达式,那么你将需要8个反斜杠,因为你要经历3个转义级别。

    此处有关Java转义序列的详细信息:Java Escape Sequences for Character and String Literals