ColdFusion Replace函数替换双波浪号输出异常,求可行解决方案
问题原因
该问题是ColdFusion内置Replace函数的全局替换逻辑导致的:开启all参数时,函数每匹配到一段目标字符串后,指针会直接跳到该匹配段的末尾,不会回扫已经处理过的字符。
针对你的场景,d~~~e中的三个连续~处理逻辑如下:
- 先匹配前两个
~,替换为~X~ - 指针直接跳到第三个
~的位置,此时仅剩余1个~无法匹配,最终得到d~X~~e,和预期不符。
可行解决方案
方案1:使用正则替换(最便捷)
用REReplace配合正向前瞻匹配实现需求,匹配所有后面紧跟另一个~的~,替换为~X即可:
<cfset test = 'a~b~~c~d~~~e'> <cfset test2 = REReplace(test, '~(?=~)', '~X', 'all')> <cfoutput> test #test# <br> test2 #test2# <br>wanted: a~b~X~c~d~X~X~e </cfoutput>
运行后test2的输出完全匹配预期。
方案2:循环替换(兼容旧版本CF)
如果环境不支持正则的前瞻语法,可以循环执行替换,直到字符串中不存在~~为止:
<cfset test = 'a~b~~c~d~~~e'> <cfset test2 = test> <cfloop condition="Find('~~', test2)"> <cfset test2 = Replace(test2, '~~', '~X~', 'all')> </cfloop>
这个方案每次替换后都会重新扫描整个字符串,直到没有连续的双~存在,也能得到正确结果。
内容的提问来源于stack exchange,提问作者Betty Mock
相关产品推荐
相关产品推荐

