我使用以下正则表达式从rfc822多部分电子邮件中提取文件名。
private static Pattern filenamePattern = Pattern.compile("(?<=filename=\").*?(?=\")");
这可以提取具有空格的文件名,如:
Content-Type : application/pdf; name="Key.Enrollment_Final.pdf"
但无法提取未引用的文件名,例如:
Content-Type : application/octet-stream; name=.config
我无法弄明白如何获得两者。对于第一个引用,我想我可以检查(?&lt; = filename = \“?),但是我该如何检查空格或行尾或引用?
答案 0 :(得分:1)
以下模式适用于上述两个测试用例。第1组包含您的文件名。
name=\"?(.*)\"?
答案 1 :(得分:1)
我只在filename
标题中指定了Content-Disposition
属性,但未在Content-Type
标题中指定。
无论哪种方式,这都是正确匹配filename
属性的正则表达式,根据RFC 1806(引用RFC 1521和RFC 822。
"filename=(?:([\\x21-\\x7E&&[^\\Q()<>[]@,;:\\\"/?=\\E]]++)|\"((?:(?:(?:\r\n)?[\t ])+|[^\r\"\\\\]|\\\\[\\x00-\\x7f])*)\")"
嗯,匹配是一回事,但你仍然需要在第二种情况下处理文件名,至少要取消引用特殊字符。 (您仍然需要将RFC 822中定义的线性空白:(?:(?:\r\n)?[\t ])+
折叠到单个空格,并替换不可打印的字符。)
答案 2 :(得分:0)
我不知道我是否理解正确,但如果你想保留文件的名称,这应该有效:
private static Pattern filenamePattern = Pattern.compile(".*application\\/.* name=\\"?([^ ]+)\\"?");
在filenamePattern.match(1)
中你应该得到结果
答案 3 :(得分:0)
我猜这个正则表达式符合你的目的:
name\=\"?([\w\.]+)\"?
您可以根据您的文件名处理([\w\.]+)
,但当前状态会捕获两个给定的示例。