NSRegularExpression使用func.*{\n\n匹配空首行函数定义无结果问题
你的问题同时存在API使用错误和正则规则、配置错误两个问题:
1. 核心错误:误用NSRegularExpression.escapedPattern(for:)
该方法的作用是将普通文本转义为正则中的字面量匹配内容,会自动把你写的正则元字符(., *, {等)全部加反斜杠转义,导致你定义的正则规则完全失效,变成匹配固定字符串func.*{\n\n,自然无法得到匹配结果。
只有当你需要把用户输入的普通文本作为正则里的固定匹配片段时才需要调用该方法,自己编写正则规则不需要做转义处理。
2. 正则规则与配置错误
- 你开启了
.dotMatchesLineSeparators选项,会让.匹配换行符,func.*{会贪婪匹配到整个文本最后一个{的位置,完全不符合匹配单个函数定义的需求。 - 原规则
func.*{\n\n没有考虑空行可能带缩进空格的场景,实际项目中的空行大多会携带对应层级的缩进字符,不会是完全无内容的纯换行。 - 原
NSRange(text)!的初始化方式不符合Swift String与NSRange的兼容规范,遇到包含非ASCII字符的文本会直接崩溃。
修正后的可用代码
let text = """ override func withFirstLineEmpty(_ animated: Bool) { print() } override func withNoFirstLineEmpty(_ animated: Bool) { print() } """ // 正则规则解释: // func[^{]*:匹配func开头到左大括号前的所有内容,避免跨行 // \\{:匹配左大括号 // \\s*\\n\\s*\\n:匹配大括号后的换行、带任意缩进的空行、下一个换行 let regexString = "func[^{]*\\{\\s*\\n\\s*\\n" let regex = try! NSRegularExpression(pattern: regexString, options: [.useUnixLineSeparators]) let matches = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) // matches.count = 1,正确匹配到第一个带空行的函数定义
内容的提问来源于stack exchange,提问作者Blazej SLEBODA
相关产品推荐
相关产品推荐

