ColdFusion使用listGetAt提取分隔符包裹内容遇括号截断如何解决
问题根源
ColdFusion的列表函数(ListLen()/ListGetAt()等)的分隔符参数是单字符集合,不是完整字符串。你传入的~|(~~)|~会被拆成~、|、(、)四个独立分隔符,所以内容里的(会被识别为分隔符触发截断,这是逻辑出错的核心原因。
解决方案1:使用正则匹配提取(推荐)
直接用正则匹配所有~|(~和~)|~之间的内容,不受内部字符影响:
<cfoutput> <cfset test = "supplier_id ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'"> <!--- 正则匹配~|(~和~)|~之间的所有内容 ---> <cfset reg = "~\\|\\(~(.*?)~\\)\\|~"> <cfset matchResult = ReMatch(reg, test)> <cfset column_name = ""> <cfloop array="#matchResult#" item="item"> <!--- 去掉匹配结果的前后包裹符,只保留中间数据 ---> <cfset content = REReplace(item, reg, "\1")> <cfset column_name = ListAppend(column_name, content, ",")> </cfloop> Result : #column_name# </cfoutput>
输出结果完全符合预期:'3422' , 'WD Ltd.' , 'Yaya Toure (temp)' , '013-7718321'
解决方案2:替换多字符分隔符后再用列表函数
如果要保留列表处理的逻辑,先把多字符分隔符统一替换成数据中不存在的单字符(比如不可见字符chr(1)),再做分割即可:
<cfoutput> <cfset test = "supplier_id ~|(~ '3422' ~)|~supplier_name ~|(~ 'WD Ltd.' ~)|~project_personnel ~|(~ 'Yaya Toure (temp)' ~)|~lt_project_code ~|(~ '013-7718321' ~)|~ id ~|(~ '668'"> <!--- 把两种包裹分隔符都替换为同一个单字符分隔符 ---> <cfset processedStr = Replace(test, "~|(~", chr(1), "ALL")> <cfset processedStr = Replace(processedStr, "~)|~", chr(1), "ALL")> <cfset column_name = ""> <cfloop index="i" from="2" to="#ListLen(processedStr, chr(1))#" step="2"> <cfset column_name = ListAppend(column_name, ListGetAt(processedStr, i, chr(1)), ",")> </cfloop> Result : #column_name# </cfoutput>
效果和正则方案完全一致。
内容的提问来源于stack exchange,提问作者sg552
相关产品推荐
相关产品推荐

