多行正则表达式 - 只匹配第一行,忽略其余行
Multiline REGEX - match only the first line, ignore the rest of lines
获取远程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));
输出为"undefined"。但是如果:
s = "220-xsistema.lt ESMTPSA XMailServer 1.2 service ready";
然后一切正常 - 输出为 "xsistema.lt"。我的问题是 - 如何只匹配第一行?
默认情况下 .
不匹配 newline
。所以使用 [\s\S]
而不是 .
或使用 DOTALL
标志,
Pattern.DOTALL
或 (?s)
告诉 Java 也允许点匹配换行符。
Pattern regex = Pattern.compile("^\d{3}[ -](.*?)( .*)*$", Pattern.DOTALL);
默认情况下,.
不匹配换行和回车等换行字符returns。您需要打开此功能,最简单的方法是内联 (?s)
(dotall) 模式修饰符。
Pattern p = Pattern.compile("(?s)^\d{3}[ -](.*?)( .*)*$");
获取远程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));
输出为"undefined"。但是如果:
s = "220-xsistema.lt ESMTPSA XMailServer 1.2 service ready";
然后一切正常 - 输出为 "xsistema.lt"。我的问题是 - 如何只匹配第一行?
.
不匹配 newline
。所以使用 [\s\S]
而不是 .
或使用 DOTALL
标志,
Pattern.DOTALL
或 (?s)
告诉 Java 也允许点匹配换行符。
Pattern regex = Pattern.compile("^\d{3}[ -](.*?)( .*)*$", Pattern.DOTALL);
默认情况下,.
不匹配换行和回车等换行字符returns。您需要打开此功能,最简单的方法是内联 (?s)
(dotall) 模式修饰符。
Pattern p = Pattern.compile("(?s)^\d{3}[ -](.*?)( .*)*$");