You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift如何通过正则起始/终止符截取并处理目标文本?

问题

需要将带换行和空白的JSON文本:

"{\n    \"DNAHeader\": {},\n    \"ItemsSaleable\": []\n}\n"

处理为无空白的目标格式:

"\"DNAHeader\":{},\"ItemsSaleable\":[]"

已通过起始符<OWSP>{<OWSP>和终止符<OWSP>}<OWSP>(<OWSP>对应Swift正则的\s*)生成正则字符串"\\s*{\\s*(.*?)\\s*}\\s*",但使用以下代码处理后,结果未移除外层的{},得到"{\"DNAHeader\":{},\"ItemsSaleable\":[]}":

var childText = text.replacingOccurrences(of: regexPattern, with: "$1", options: .regularExpression).filter { !$0.isWhitespace }
解决办法

核心问题

你错误地给正则模式添加了#前缀和后缀,导致正则无法匹配目标文本,替换操作根本没生效。Swift的正则表达式不需要用#作为分隔符,这会让正则变成#\\s*{\\s*(.*?)\\s*}\\s*#,完全匹配不上原文本的结构,最终只执行了空白过滤,外层{}自然保留。

修改代码

  1. 去掉正则模式中的#包裹:
if let group = groupOrItem as? Group,
   let initiator = group.typeSyntax?.initiator?.literal.literalValue?.replacingOccurrences(of: "<OWSP>", with: "\\s*"),
   let terminator = group.typeSyntax?.terminator?.literal.literalValue?.replacingOccurrences(of: "<OWSP>", with: "\\s*")
{
    let captureString = "(.*?)"
    let regexString = initiator + captureString + terminator
    // 移除多余的#分隔符
    let regexPattern = regexString
}
  1. 先执行正则替换截取内部内容,再过滤所有空白:
var childText = text.replacingOccurrences(of: regexPattern, with: "$1", options: .regularExpression)
childText = childText.filter { !$0.isWhitespace }

这样处理后,原文本外层的{}及周围空白会被替换为捕获到的内部内容,再过滤所有空白后,就能得到目标格式的字符串。

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34