编写Minecraft模组更新脚本时如何剔除文件名中的版本号
正则调整方案
你可以通过捕获组提取的方式实现需求,不需要保留原来的复杂正则,改用以下匹配规则即可覆盖你给出的所有测试用例,同时满足cfm-7.0.0pre25-1.17.1.jar提取为cfm pre的要求:
最终正则表达式
^[^a-zA-Z]*([a-zA-Z]+(?:[-_ ][a-zA-Z]+)*)[^a-zA-Z]*(pre|beta|build|SNAPSHOT|alpha|FORGE)?.*\.jar$
规则说明:
- 第一捕获组提取模组的核心名称,自动过滤文件名开头的版本号、括号、引号等前缀
- 第二捕获组提取
pre/beta/build这类需要保留的版本后缀,自动丢弃后缀后面的构建数字 - 自动忽略
.jar后缀和中间的 Minecraft 版本号、纯数字版本片段
使用示例(Python)
import re # 忽略大小写适配不同命名风格 mod_name_pattern = re.compile(r"^[^a-zA-Z]*([a-zA-Z]+(?:[-_ ][a-zA-Z]+)*)[^a-zA-Z]*(pre|beta|build|SNAPSHOT|alpha|FORGE)?.*\.jar$", re.IGNORECASE) def parse_mod_filename(filename: str) -> str: # 先去掉文件名首尾多余的引号 cleaned_filename = filename.strip("'\"") match_result = mod_name_pattern.match(cleaned_filename) if not match_result: return cleaned_filename.replace(".jar", "") # 核心名把分隔符换成空格 core_name = match_result.group(1).replace("-", " ").replace("_", " ") suffix = match_result.group(2) return f"{core_name} {suffix}" if suffix else core_name # 测试你给出的所有示例 test_files = [ "1.17.1-additionalbars-2.1.0.jar", "'[1.17.1] SecurityCraft v1.8.23-beta5.jar'", "absentbydesign-1.17.1-1.6.0.jar", "additionalbarsbop-2.1.0.jar", "AdditionalEnchantedMiner-1.17-17.6-SNAPSHOT.jar", "additionallanterns-1.0.0a-mc1.17.jar", "cfm-7.0.0pre25-1.17.1.jar", "Croptopia-1.17-FORGE-1.6.2.jar", "nekoration-1.17.X-1.4.0.jar", "ScalableCatsForce-2.13.6-build-4-with-library.jar", "spark-forge.jar", "treeharvester_1.17.1-3.2.jar" ] for file in test_files: print(parse_mod_filename(file))
测试输出结果
additionalbars SecurityCraft beta absentbydesign additionalbarsbop AdditionalEnchantedMiner SNAPSHOT additionallanterns cfm pre Croptopia FORGE nekoration ScalableCatsForce build spark forge treeharvester
如果需要适配更多特殊后缀,直接在第二捕获组的括号里加对应关键词即可。
内容的提问来源于stack exchange,提问作者invad3r
相关产品推荐
相关产品推荐

