我正在编写一个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}]", ""); ....}]
答案 0 :(得分:0)
您的示例代码在Groovy或MEL表达式组件中工作,但在DataMapper中不起作用。在处理MEL代码之前,DataMapper似乎进行了字符串文字转义处理。这意味着在MEL处理它之前,字符串中的每两个反斜杠将变为一个反斜杠。 MEL然后执行相同的操作并将每两个反斜杠处理为一个反斜杠。
这可能很棘手,因为你有三个级别在工作。
由于你只需要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