我们最近从CF 10转到CF 2016,偶然发现了以下问题:
<cfscript>
x = "abc";
x = replaceList(x, "ab|cd", "1|2", "|");
writeDump(x);
// CF 11, CF 2016
// >> 12
// CF 10, Railo/Lucee
// >> 1c
// --------------------
x = "abc";
x = replaceList(x, "ab,cd", "1,2", ",");
writeDump(x);
// CF 11, CF 2016
// >> 1c
// CF 10, Railo/Lucee
// >> 1c
</cfscript>
这里发生了什么?为什么Adobe会对此进行更改not documented?它甚至是一个有意改变的开始吗?
更新:
提交给Adobe的答案 0 :(得分:2)
简答:
我怀疑这是无意的,并会提交错误报告。作为解决方法,请尝试转义管道符号:replaceList(x, "ab|cd", "1|2", "\|");
。
更长的回答:
在内部,此函数几乎肯定会使用某种正则表达式(其中管道符号|
具有特殊含义,即逻辑OR
)。我的猜测是CF首先使用String.split("regex")将两个列表分成数组。然后循环遍历数组以执行替换。
根据结果,CF不会转义管道符号,导致列表的拆分方式与预期不同。每个单独的角色都会成为一个单独的元素,显然最终会比你想要的更多匹配,即基本字符串中的每个字符。
list = "ab|cd";
writeDump(list.split("|") );
但是,如果使用\
转义管道符号,则会得到预期的结果:
list = "ab|cd";
writeDump(list.split("\|"));