使用jQuery.replace()正则仅删除第二个连字符后内容的问题排查
原实现的问题根源
你写的正则 /\-[^-]*$/g 的匹配规则是:定位到字符串中任意一个直到末尾都不再出现其他连字符的连字符,将这个连字符及其后面的所有内容替换为空。
单连字符的字符串中,那个唯一的连字符本身就完全符合这个匹配条件,因此会被错误识别为待删除目标,连带后面的歌曲名内容一起被裁掉,最终只剩最开头的艺人名部分。
调整后的实现方案
要满足「仅当存在第二个连字符时,删除第二个连字符及之后的所有内容;单连字符字符串原样保留」的需求,需要将正则的匹配条件收紧到「必须出现第二个连字符才执行替换」,调整后的代码为:
var trimmedSong = songTitle.replace(/^(.*?-.*?)-.*$/, '$1');
注:此处调用的replace是JavaScript原生字符串方法,无需依赖jQuery即可正常运行。
逻辑说明
- 正则从字符串开头开始匹配,捕获组
(.*?-.*?)会依次匹配:从开头到第一个连字符的内容、第一个连字符本身、以及第二个连字符之前的所有保留内容。 - 只有当字符串中确实存在第二个连字符时,整个正则才能匹配成功,此时将匹配到的末尾部分替换为捕获组保留的内容,即裁掉第二个连字符及之后的所有内容。
- 如果字符串仅存在1个连字符,完全凑不齐正则要求的“两个连字符”的匹配结构,正则会匹配失败,
replace方法直接返回原始字符串,不会做任何修改。
实际效果验证
- 输入单连字符字符串
Artist name - song title:正则匹配失败,输出和输入完全一致,无修改。 - 输入双连字符字符串
Artist name - song title - album here:正则匹配成功,输出Artist name - song title,完全符合预期裁剪要求。
内容的提问来源于stack exchange,提问作者Eddy H
相关产品推荐
相关产品推荐

