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

How can I extract a string between optional quotes?

我正在使用 Javascript 正则表达式从 Content-Disposition HTTP Header.

中提取“文件名”

Content-Disposition 值的示例是:

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 正常工作?

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

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

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

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

模式匹配:

  • \bfilename= 字面匹配前面有单词边界
  • ("?) 捕获 组 1,可选择匹配 "
  • ([^"\r\n]+) 捕获 组 2,匹配任何字符 1 次以上,: 或换行符
  • 除外
  • </code> 反向引用与第 1 组相同</li> </ul> <p><a href="https://regex101.com/r/IoBFKy/1" rel="nofollow noreferrer">Regex demo</a></p> <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code"> <pre><code>var contentDisposition = "attachment; filename=\"myFile.pdf\"" // get Content-Disposition from HTTP Header const fileNameMatch = contentDisposition.match(/\bfilename=("?)([^"\r\n]+)/); const fileName = fileNameMatch[2]; console.log(fileName);

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

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