如何用Javascript正则提取Content-Disposition中可选引号包裹的文件名
解决方案
问题根因
你当前使用的正则失效核心原因是:(.+)属于贪婪匹配规则,会尽可能多的匹配字符,而末尾的"?是可选匹配,正则引擎会优先以「匹配0个引号」的逻辑满足规则,因此带引号的场景下,末尾的引号会被贪婪匹配吞入捕获组,导致输出结果多了后缀引号。
修复方案
将正则调整为 filename="?([^"]+)"? 即可兼容你提到的两种场景。其中[^"]+表示匹配所有非引号的字符,遇到引号就会自动停止匹配,不会把末尾的引号吞入捕获组。
如果需要适配更复杂的场景(比如filename后还有其他用分号分隔的参数),可以使用更严谨的正则:filename="?([^";]+)"?,额外排除分号,避免把后续参数内容也匹配进来。
测试验证
// 场景1:无引号 const contentDisposition1 = "attachment; filename=myFile.pdf" const fileNameMatch1 = contentDisposition1.match(/filename="?([^"]+)"?/); const fileName1 = fileNameMatch1[1]; console.log(fileName1); // 输出:myFile.pdf // 场景2:带引号 const contentDisposition2 = "attachment; filename=\"myFile.pdf\"" const fileNameMatch2 = contentDisposition2.match(/filename="?([^"]+)"?/); const fileName2 = fileNameMatch2[1]; console.log(fileName2); // 输出:myFile.pdf
内容的提问来源于stack exchange,提问作者matteogll
相关产品推荐
相关产品推荐

