Swift中使用ActiveLabel库实现双引号内语句的正则匹配问题
修复双引号包裹内容的正则匹配,实现单独识别
问题根源
你当前使用的正则(?<=“).*(?=”)中,.*是贪婪匹配模式——它会尽可能匹配最长的符合条件的字符串。当段落中存在多组双引号时,会从第一个“的后方一直匹配到最后一个”的前方,导致多组双引号内容被合并识别为一个整体。
两种解决方案
方案1:非贪婪匹配(推荐)
将.*替换为.*?,让正则切换为非贪婪匹配模式,尽可能匹配最短的符合条件的字符串:
static let quotePattern = "(?<=“).*?(?=”)"
方案2:排除型字符集
使用[^”]*匹配所有不是右双引号的字符,遇到第一个”时立即停止匹配:
static let quotePattern = "(?<=“)[^”]*(?=”)"
修改后的完整代码
struct RegexParser { // 已修复的双引号匹配正则 static let quotePattern = "(?<=“).*?(?=”)" static let emailPattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" static let urlPattern = "(^|[\\s.:;?\\-\\]\\<\\(])" + "((https?://|www\\.|pic\\.)[-\\w;/?:@&=+$\\|\\_.!~*\\|'()\\[\\]%#,☺]+[\\w/#](\\(\\))?)" + "(?=$|[\\s',\\|\\(\\).:;?\\-\\[\\]\\>\\)])" private static var cachedRegularExpressions: [String : NSRegularExpression] = [:] static func getElements(from text: String, with pattern: String, range: NSRange) -> [NSTextCheckingResult]{ guard let elementRegex = regularExpression(for: pattern) else { return [] } return elementRegex.matches(in: text, options: [], range: range) } private static func regularExpression(for pattern: String) -> NSRegularExpression? { if let regex = cachedRegularExpressions[pattern] { return regex } else if let createdRegex = try? NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) { cachedRegularExpressions[pattern] = createdRegex return createdRegex } else { return nil } } }
效果验证
假设输入文本为:这是“第一句引用”,还有“第二句引用”,修改后的正则会分别识别出第一句引用和第二句引用两个独立的结果,不会再合并为一个整体。
内容的提问来源于stack exchange,提问作者Santiago Padilla
相关产品推荐
相关产品推荐

