Java正则表达式从多部分字段中提取文件名不起作用

时间:2014-01-24 11:37:49

标签: java android regex multipart

我使用以下正则表达式从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 = \“?),但是我该如何检查空格或行尾或引用?

4 个答案:

答案 0 :(得分:1)

以下模式适用于上述两个测试用例。第1组包含您的文件名。

name=\"?(.*)\"?

答案 1 :(得分:1)

我只在filename标题中指定了Content-Disposition属性,但未在Content-Type标题中指定。

无论哪种方式,这都是正确匹配filename属性的正则表达式,根据RFC 1806(引用RFC 1521RFC 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\.]+),但当前状态会捕获两个给定的示例。

Check this Regex101 fiddle