Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于提取内容类型的正则表达式_Java_Regex_Email_Email Headers - Fatal编程技术网

Java 用于提取内容类型的正则表达式

Java 用于提取内容类型的正则表达式,java,regex,email,email-headers,Java,Regex,Email,Email Headers,如何提取包含内容类型信息的行?在某些邮件中,这些标题可以是2行、3行甚至4行,具体取决于发送方式。这是一个例子: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore

如何提取包含内容类型信息的行?在某些邮件中,这些标题可以是2行、3行甚至4行,具体取决于发送方式。这是一个例子:

Content-Type: text/plain;
    charset="us-ascii"
Content-Transfer-Encoding: 7bit

Lorem ipsum dolor sit amet, consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam, quis nostrud exercitation 
ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit 
esse cillum dolore eu fugiat nulla pariatur. Excepteur sint 
occaecat cupidatat non proident, sunt in culpa qui officia 
deserunt mollit anim id est laborum.
我尝试了这个正则表达式:
^(内容-.*:(.|\n)*)**
,但它能抓住一切

我应该如何在Java中表达我的正则表达式以获得唯一部分:

Content-Type: text/plain;
    charset="us-ascii"
Content-Transfer-Encoding: 7bit
这将匹配从内容类型开始的所有内容,直到第一行完全为空。

^Content-(.|\n)*\n\n

这将匹配到空白行。

你可以试试这个正则表达式< /p>
Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);

检查相关RFC以获得标题的准确定义。Irc在本质上需要考虑具有断线和一个或多个空白字符(例如,空间、不中断空间、选项卡)的所有内容,以作为同一标题行的一部分。我还认为应该将换行符和空格折叠成一个空格元素(注意:可能有更复杂的规则,所以请检查RFC)

仅当新行直接以非空白字符开头时,它才是下一个标题,如果紧跟其后的是另一个换行符,则它将结束标题部分并开始正文部分


顺便说一句:为什么不直接使用JavaMail而不是重新发明轮子呢?

这个经过测试的脚本适合我:

import java.util.regex.*;
公开课考试
{
公共静态void main(字符串[]args)
{
字符串主题字符串=
“内容类型:文本/普通;\r\n”+
“字符集=\“us ascii\”\r\n”+
“内容传输编码:7比特\r\n”+
“\r\n”+
“Lorem ipsum door sit amet,concetetur adipising elit,\r\n”+
“暂时性的劳动和医疗事故\r\n”+
“aliqua.Ut enim ad minim veniam,quis nostrud实习\r\n”+
“ullamco laboris nisi ut aliquip ex ea commodo consequat。\r\n”+
“在voluptate velit中的reprehenderit中的Duis aut irure dolor \r\n”+
“无法定财产权,但圣徒除外\r\n”+
“有时,不可轻率行事,必须以官方过失为准\r\n”+
“取消安装mollit anim id est labourum。\r\n”;
字符串resultString=null;
Pattern regexpatern=Pattern.compile(
“^Content Type.*?(?=\\r?\\n\\s*\\n)”,
Pattern.DOTALL | Pattern.CASE_不区分大小写|
Pattern.UNICODE|u CASE | Pattern.MULTILINE);
Matcher regexMatcher=regexpatern.Matcher(subjectString);
if(regexMatcher.find()){
resultString=regexMatcher.group();
} 
System.out.println(resultString);
}
}

它适用于同时具有有效:
\r\n
和(无效但在野外常用):
\n
Unix样式的行结束符的文本。

谢谢!但是,当我这样使用它时,为什么会得到一个
StackOverflowerError
mailContent.replaceFirst(“^Content Type(?:。\s)*?(?=\n\\s+\n)”,”)@xEnOn我真的不知道。你能在ideone.com上发布一个示例吗?我甚至不知道应该将代码的哪一部分粘贴为示例。哈哈,好像整个过程都很好,但只要我把正则表达式改成你建议的正则表达式,我就会得到一个StackOverflower错误。所以唯一的问题是
replaceAll
行。这很奇怪,因为我把你的正则表达式放进正则表达式测试仪时,它就工作了。但是我不知道Java为什么会抛出这个错误。我想你可能需要像这样对换行符进行转义:
“^Content Type(?:.|\\s)*?(?=\\n\\s+\\n)”
@ridgerunner是的,我也这么认为,但我的工具坚持认为\n不能被双重转义。我尝试了这个方法,但它
find()
返回false。它找不到部件。@xEnOn我不确定它为什么返回false,这里显示的是匹配@xEnOn我更新了正则表达式,您现在可以尝试一下并告诉我它是否有效。
Pattern regex = Pattern.compile("Content-Type.*?(?=^\\s*\n?\r?$)", 
                                 Pattern.DOTALL | Pattern.MULTILINE);