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*#,完全匹配不上原文本的结构,最终只执行了空白过滤,外层{}自然保留。
修改代码
- 去掉正则模式中的
#包裹:
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 }
- 先执行正则替换截取内部内容,再过滤所有空白:
var childText = text.replacingOccurrences(of: regexPattern, with: "$1", options: .regularExpression) childText = childText.filter { !$0.isWhitespace }
这样处理后,原文本外层的{}及周围空白会被替换为捕获到的内部内容,再过滤所有空白后,就能得到目标格式的字符串。
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

