如何在可选引号之间提取字符串?

mm9b1k5b  于 2021-09-13  发布在  Java
关注(0)|答案(3)|浏览(403)

我使用javascript正则表达式从内容处置http头中提取“文件名”。
内容处置值的一个示例是:

attachment; filename="myFile.pdf"

在某些情况下,服务器不会将文件名括在引号中:

attachment; filename=myFile.pdf

案例1(确定):

var contentDisposition = "attachment; filename=myFile.pdf" // get Content-Disposition from HTTP Header
const fileNameMatch = contentDisposition.match(/filename="?(.+)"?/);
const fileName = fileNameMatch[1];
console.log(fileName); // Expected: myFile.pdf - Actual: myFile.pdf

案例2(ko):

var contentDisposition = "attachment; filename=\"myFile.pdf\"" // get Content-Disposition from HTTP Header
const fileNameMatch = contentDisposition.match(/filename="?(.+)"?/);
const fileName = fileNameMatch[1];
console.log(fileName); // Expected: myFile.pdf - Actual: myFile.pdf"

在案例2中,预期结果为: myFile.pdf 虽然实际: myFile.pdf" (最后一个报价未删除)
如何修复正则表达式以使case2正常工作?

jfgube3f

jfgube3f1#

非贪婪 +? 在可选类之前不起作用,请尝试显式类 [^"] :

re = /filename="?([^"]+)"?/

 contentDisposition = `attachment; filename="myFile.pdf"`
 console.log(contentDisposition.match(re)[1])

 contentDisposition = `attachment; filename=myFile.pdf`
 console.log(contentDisposition.match(re)[1])

另一个(或许更好)选择是锚定整个事件:

re = /filename="?(.+?)"?$/

s = `attachment; filename="myFile.pdf"`
console.log(s.match(re)[1])

s = `attachment; filename=myFile.pdf`
console.log(s.match(re)[1])
umuewwlo

umuewwlo2#

您可以使用与可选配置匹配的捕获组 " 使用反向引用与双引号匹配,并从组2获取值。

\bfilename=("?)([^"\r\n]+)\1

模式匹配: \bfilename= 以单词边界开头的字面匹配 ("?) 捕获组1,可选匹配
" ([^"\r\n]+) 捕获组2,匹配任何字符的1+倍,除了 : 还是新线 \1 反向引用以与组1相同
正则表达式演示

var contentDisposition = "attachment; filename=\"myFile.pdf\"" // get Content-Disposition from HTTP Header
const fileNameMatch = contentDisposition.match(/\bfilename=("?)([^"\r\n]+)\1/);
const fileName = fileNameMatch[2];
console.log(fileName);
mbyulnm0

mbyulnm03#

使用正则表达式解析http字段值很棘手。
要正确处理,你必须考虑更多的边缘情况,比如字符串中的逃出引用。

相关问题