如何在 macOS 平台使用 Swift 提取两个大括号之间的内容
问题原因
你的正则使用默认贪婪匹配规则,.*会尽可能匹配最长的字符序列,会从字符串第一个{开始一直匹配到目标邮箱的位置,中间会跨过其他无关的大括号片段,因此输出结果不符合预期。同时没有对邮箱内容做正则转义,若邮箱包含.、+等正则特殊字符时会出现匹配错误。
修正方案
将正则的匹配内容限制在单个大括号内部,同时对邮箱做转义处理即可。
修正后的完整代码如下:
let email = "abcd@gmail.com" let content = "{any string content efgh@yahoo.com any string content} {any string content abcd@gmail.com any string content}{any string content klmn@yahoo.com any string content}" // 先对邮箱做正则转义,避免特殊字符影响匹配 let escapedEmail = NSRegularExpression.escapedPattern(for: email) // 用[^{}]匹配非大括号的字符,保证不会跨越大括号范围 let regex = try NSRegularExpression(pattern: "\\{([^{}]*\(escapedEmail)[^{}]*)\\}") let matches = regex.matches(in: content, range: NSRange(content.startIndex..., in: content)) for match in matches { let swiftRange = Range(match.range(at: 1), in: content)! print(content[swiftRange]) // 输出:any string content abcd@gmail.com any string content }
说明
[^{}]表示匹配任意不是{和}的字符,因此匹配范围只会限定在单个大括号内部,不会出现跨片段匹配的问题NSRegularExpression.escapedPattern(for:)会自动转义字符串中的正则特殊字符,保证邮箱会被当成普通字符串匹配
内容的提问来源于stack exchange,提问作者Kênh Vui Để Học
相关产品推荐
相关产品推荐

