处理特殊字符的骡子
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 个级别在工作。
- DataMapper 将 Java 转义规则应用于字符串。
- MEL 将转义规则应用于字符串。
- 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
我正在编写一个 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 个级别在工作。
- DataMapper 将 Java 转义规则应用于字符串。
- MEL 将转义规则应用于字符串。
- 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