You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式在线可用但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:02:35