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



我使用一个Javascript正则表达式来提取"文件名";来自Content Disposition 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"(最后一个报价未删除(

如何修复正则表达式以使案例2正常工作?

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

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])

您可以使用一个捕获组将可选的"与backreference匹配,以匹配双引号,并从组2中获取值。

bfilename=("?)([^"rn]+)1

模式匹配:

  • bfilename=匹配前面的单词边界
  • ("?)捕获组1,可选匹配"
  • ([^"rn]+)捕获组2,匹配除:或换行符之外的任何字符的1+倍
  • 1Backreference与组1匹配

Regex演示

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

使用正则表达式解析HTTP字段值很棘手。

要想做得好,您必须考虑更多的边缘情况,例如字符串中的转义引号。

相关内容

  • 没有找到相关文章

最新更新