处理特殊字符的骡子

Mule dealing with Special Characters

我正在编写一个 MEL 函数来处理来自 JSON 有效载荷的特殊字符。我正在使用 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}]", ""); ....}]

您的示例代码适用于 Groovy 或 MEL 表达式组件,但不适用于 DataMapper。看起来 DataMapper 在处理 MEL 代码之前进行了字符串文字转义处理。这意味着在 MEL 处理字符串之前,字符串中的每两个反斜杠将变成一个反斜杠。 MEL 然后做同样的事情并将每两个反斜杠处理为一个反斜杠。

这可能会很棘手,因为您有 3 个级别在工作。

  1. DataMapper 将 Java 转义规则应用于字符串。
  2. MEL 将转义规则应用于字符串。
  3. replaceAll() 将正则表达式转义规则应用于字符串。

由于您只需要 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