修复无法正确匹配大于X的罗马数字及EP编号的正则表达式问题
正则匹配问题修复方案
原正则问题根因
原有正则的核心问题是罗马数字匹配规则增加了不必要的^行首锚定,和开头的(.*?)惰性匹配逻辑冲突,同时罗马数字匹配规则仅支持10以内取值,导致≥10的罗马数字会被开头的通配符直接吞入第一个分组。
修正后正则
如果你的场景需要支持1~3999范围的罗马数字,使用通用版本:
^.*?\b(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))\s+EP\. (\d+).*$
如果仅需要匹配最大到39的罗马数字(XXXIX以内),可以使用简化版本:
^.*?\b(X{0,3}(IX|IV|V?I{0,3}))\s+EP\. (\d+).*$
功能说明
- 开头的
^.*?\b直接跳过罗马数字之前的所有内容,完全符合“忽略前缀”的需求 - 罗马数字匹配规则覆盖对应范围内的所有合法写法,不会出现≥10就匹配异常的问题
- 分组1对应匹配到的罗马数字,分组2对应匹配到的EP集数
测试效果
针对测试文本PEPA THE PIG XVI EP. 169 - BAD ENDING:
- 分组1命中结果:
XVI - 分组2命中结果:
169
完全符合预期。
内容的提问来源于stack exchange,提问作者mgj1993
相关产品推荐
相关产品推荐

