以下是获取远程SMTP服务器名称的方法:
public static String getMTAName(String data) {
Pattern p = Pattern.compile("^\\d{3}[ -](.*?)( .*)*$");
Matcher m = p.matcher(data);
if (m.find()) {
return m.group(1);
}
return "undefined";
}
问题是,如果我通过多行响应,如:
String s = "220-xsistema.lt ESMTPSA XMailServer 1.2 service ready\r\n220 Some other info";
System.out.println(getMTAName(s));
输出是"未定义"。但是如果:
s = "220-xsistema.lt ESMTPSA XMailServer 1.2 service ready";
然后一切正常 - 输出是" xsistema.lt"。我的问题是 - 如何只匹配第一行?
答案 0 :(得分:1)
.
与newline
不匹配。因此请使用[\s\S]
代替.
或使用DOTALL
标记,
Pattern.DOTALL
或(?s)
告诉Java允许点匹配换行符。
Pattern regex = Pattern.compile("^\\d{3}[ -](.*?)( .*)*$", Pattern.DOTALL);
答案 1 :(得分:1)
默认情况下,.
不匹配换行符,例如换行符和回车符。您需要启用此功能,最简单的方法是内联(?s)
(dotall)模式修饰符。
Pattern p = Pattern.compile("(?s)^\d{3}[ -](.*?)( .*)*$");