多行REGEX - 仅匹配第一行,忽略其余行

时间:2015-04-09 18:25:47

标签: java regex pattern-matching

以下是获取远程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"。我的问题是 - 如何只匹配第一行?

2 个答案:

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