如何在SwiftLint中匹配多行正则以检测多方法协议?
解决SwiftLint自定义规则匹配多成员协议的问题
问题原因
你之前的正则在SwiftLint中失效,是因为SwiftLint基于NSRegularExpression,默认情况下.元字符不会匹配换行符(\n);而在线正则测试器通常默认开启了DOTALL模式(允许.匹配换行),所以测试有效但集成到构建流程后无法匹配跨多行的内容。
修改后的正则规则
要实现匹配包含两个及以上方法/属性的协议,需要调整正则开启DOTALL模式,并优化匹配逻辑:
custom_rules: protocol_more_than_one_member: name: "Protocol with more than one member" regex: '(?s)protocol\s+\w+\s*{\s*(?:.*?(?:func|var|let)\s+.*?\s*){2,}' message: "If you would like to create a protocol with multiple members, create separate protocols with one member each, then combine them with a typealias. For example, typealias BothProtocols = FirstProtocol & SecondProtocol" severity: warning
正则说明
(?s):前缀开启DOTALL模式,让.可以匹配包括换行在内的所有字符protocol\s+\w+\s*{:匹配协议声明的开头,包含协议名和左大括号,\s+匹配任意空白字符(空格、制表符、换行)(?:.*?(?:func|var|let)\s+.*?\s*){2,}:非捕获组,匹配至少两个方法/属性声明:.*?:非贪婪匹配,避免一次性吃掉整个协议内容(?:func|var|let):同时匹配方法(func)和属性(var/let){2,}:确保匹配至少两个成员
仅匹配多方法的版本
如果只需要检测包含多个方法的协议,把正则里的(?:func|var|let)替换为func即可:
regex: '(?s)protocol\s+\w+\s*{\s*(?:.*?func\s+.*?\s*){2,}'
内容的提问来源于stack exchange,提问作者ScottyBlades
相关产品推荐
相关产品推荐

