如何在可选引号之间提取字符串?
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);
我正在使用 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);