如何在Swift中使用正则表达式提取并打印方括号内的字符串
Swift正则提取方括号内容的解决方案
错误原因
- 正则内的
[、]是特殊元字符,用于定义字符组,匹配字面量方括号必须转义,在Swift字符串中需要写为\\[和\\] - 你当前的正则没有设置捕获组,无法单独提取方括号内的目标内容
- 第一行正则末尾的
\n前多了多余的匹配逻辑,原字符串[62AD]后直接接换行,原有写法无法匹配到对应内容
最优实现方案
统一用单条正则匹配所有方括号内的目标内容,代码更简洁:
let output = "\"Living Room\" [62AD]\n Hub \"Living Room\" [21BC]:" let range = NSRange(output.startIndex..<output.endIndex, in: output) // 正则中用小括号定义捕获组,单独提取方括号内的大写字母+数字组合 let pattern = "\\[([A-Z0-9]+)\\]" let regex = try! NSRegularExpression(pattern: pattern, options: []) let matches = regex.matches(in: output, options: [], range: range) for match in matches { // range(at: 0)是整个匹配到的串,range(at: 1)对应我们定义的第一个捕获组内容 let captureRange = match.range(at: 1) if let swiftRange = Range(captureRange, in: output) { let result = String(output[swiftRange]) print(result) // 依次输出62AD、21BC } }
保留原有双正则逻辑的修正代码
如果你需要按原来的逻辑分两次匹配,修正后的写法如下:
let output = "\"Living Room\" [62AD]\n Hub \"Living Room\" [21BC]:" let range = NSRange(output.startIndex..<output.endIndex, in: output) let patternToMatch1 = "\"Living Room\" \\[([A-Z0-9]+)\\]\n" let patternToMatch2 = "Hub \"Living Room\" \\[([A-Z0-9]+)\\]:" let captureRegex1 = try! NSRegularExpression(pattern: patternToMatch1, options: []) let captureRegex2 = try! NSRegularExpression(pattern: patternToMatch2, options: []) if let match1 = captureRegex1.firstMatch(in: output, options: [], range: range), let range1 = Range(match1.range(at: 1), in: output) { print(String(output[range1])) // 输出62AD } if let match2 = captureRegex2.firstMatch(in: output, options: [], range: range), let range2 = Range(match2.range(at: 1), in: output) { print(String(output[range2])) // 输出21BC }
内容的提问来源于stack exchange,提问作者SB26
相关产品推荐
相关产品推荐

