Javascript正则提取ABC乐谱指定演奏版本的实现方案咨询
解决方案
核心问题原因
你之前的正则使用了贪婪匹配规则,[\s\S]*会尽可能匹配最长的符合条件的字符串,所以多版本场景下会直接匹配到最后一个X:前的所有内容,导致结果错误。
正确正则规则
提取第1个版本(兼容所有场景)
^X:(?:(?!\nX:)[\s\S])*
提取任意第N个版本(N从1开始计数,把规则里的{N-1}替换为对应数字即可,比如提取第3个版本就写{2})
(?:.*?\n(?=X:)){N-1}(^X:(?:(?!\nX:)[\s\S])*)
规则说明
- 匹配时需开启多行匹配模式(正则后缀加
m),确保^可以匹配每一行的行首,避免误匹配到乐谱内容中的X:字符串 - 采用负向预查逻辑,匹配到下一个版本起始标记
\nX:或文件末尾就自动停止,不会错误吞入后续版本内容 - 兼容所有你提供的测试场景:非连续版本编号、同编号多版本、含特殊字符、单版本场景都可正确匹配
代码示例(JavaScript环境)
// 待解析的ABC文件全文 const abcFullText = `这里替换为你的ABC文件内容`; // 提取第2个版本示例:N=2,所以N-1=1,填在{1}的位置 const reg = /(?:.*?\n(?=X:)){1}(^X:(?:(?!\nX:)[\s\S])*)/m; const result = abcFullText.match(reg); const targetVersionContent = result ? result[1] : "未查询到对应版本";
内容的提问来源于stack exchange,提问作者rpc
相关产品推荐
相关产品推荐

