【问题标题】:Multiline REGEX - match only the first line, ignore the rest of lines多行正则表达式 - 仅匹配第一行,忽略其余行
【发布时间】:2015-04-09 18:25:46
【问题描述】:

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

【问题讨论】:

    标签: java regex pattern-matching


    【解决方案1】:

    .默认不匹配newline。所以使用[\s\S]代替.或者使用DOTALL标志,

    Pattern.DOTALL(?s) 告诉 Java 也允许点匹配换行符。

    Pattern regex = Pattern.compile("^\\d{3}[ -](.*?)( .*)*$", Pattern.DOTALL);

    【讨论】:

    • 是的,它有效。你能写一个真实的例子如何使用DOTALL标志吗?
    【解决方案2】:

    默认情况下,. 不匹配换行符,例如换行符和回车符。您需要打开此功能,最简单的方法是内联 (?s) (dotall) 模式修饰符。

    Pattern p = Pattern.compile("(?s)^\d{3}[ -](.*?)( .*)*$");
    

    【讨论】:

    • 不,如果s = "220 xsistema.lt"; 则不起作用。在这里,我们可以预期 SMTP 服务器响应的各种场景。
    • 您可以将第二组替换为(?: .*)?
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多