多行正则表达式 - 只匹配第一行,忽略其余行

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}[ -](.*?)( .*)*$");