正则表达式在线可用但NSRegularExpression无匹配问题求助
问题原因及替代正则方案
问题根源
你使用的在线调试工具通常基于PCRE/PCRE2正则引擎,该引擎支持\K断言(用于重置匹配起点、丢弃之前匹配的内容);但NSRegularExpression依赖的ICU正则引擎并不支持\K语法——这就是正则能被解析,但无法返回匹配结果的核心原因。
不含\K的替代正则
我们可以用捕获组替代\K的作用,将需要提取的罗马数字单独放在捕获组中,匹配后提取该组内容即可:
(?<=d|dvd|disc|disk|s|se|season|e|ep|episode)[\s._-](M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))(?=[\s._-])
使用说明
在Swift中使用该正则时,无需修改匹配逻辑,只需在获取结果时提取第1个捕获组的内容(而非整个匹配结果),就能得到纯净的罗马数字,不会包含前导的分隔符(_/空格/./-)。
示例Swift代码片段:
let regex = try! NSRegularExpression(pattern: #"(?<=d|dvd|disc|disk|s|se|season|e|ep|episode)[\s._-](M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))(?=[\s._-])"#) let string = "Series Name.Season V.Episode XI.Part XXV.Episode_name.avi" let matches = regex.matches(in: string, range: NSRange(string.startIndex..., in: string)) for match in matches { if let range = Range(match.range(at: 1), in: string) { let romanNum = String(string[range]) print(romanNum) // 依次输出 V、XI、XXV } }
验证效果
- 针对目标测试字符串,能正确匹配
V、XI、XXV等罗马数字; - 针对需要排除的
XIII: The Series season II episode V.mp4,只会匹配II和V,不会捕获开头的XIII,符合需求。
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

