正则表达式提取两个波浪线(~)间内容的技术求助
提取两个波浪线之间内容的ColdFusion正则解决方案
正确实现方式
方式一:用reReplace替换保留目标内容
修改正则逻辑,将整个字符串替换为捕获到的中间内容:
<cfset Type = reReplace(BetweenTildeCHR, "^.*~([^~]+)~.*$", "\1", "all") />
- 正则解析:
^.*~:匹配从字符串开头到第一个波浪线的所有字符([^~]+):捕获两个波浪线之间的所有非波浪线字符(确保只提取中间一段)~.*$:匹配从第二个波浪线到字符串结尾的所有字符- 替换为
\1:引用捕获到的中间内容,最终只保留目标部分
方式二:用reFind直接提取捕获组
如果只需要单次提取,reFind能更精准地获取目标内容:
<cfset matchResult = reFind("~([^~]+)~", BetweenTildeCHR, 1, true) /> <cfif matchResult.len[2] > 0> <cfset Type = mid(BetweenTildeCHR, matchResult.pos[2], matchResult.len[2]) /> </cfif>
- 第四个参数设为
true,reFind会返回包含捕获组位置和长度的结构体 - 通过
mid函数截取捕获到的中间内容
原代码失败原因
你之前的写法错误地将匹配到的内容替换成了空格,而非保留捕获的目标内容。例如.*?~(.*?)~.*虽然能定位到中间内容,但替换为空格会清空整个字符串,而非引用\1保留捕获部分。
内容的提问来源于stack exchange,提问作者Gary Robinson
相关产品推荐
相关产品推荐

