有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正则表达式来匹配带有换行符的某些模式

我想编写正则表达式以匹配以下模式:

From: ***********************
Sent: ***********************
To: ***********************
Subject: *******************

我把正则表达式写成

.*From:.+(\n)Sent:.+(\n)To:.+(\n)Subject:.+(\n).*

但这是行不通的。请帮助我,因为我是新的正则表达式


共 (4) 个答案

  1. # 1 楼答案

    这可以通过以下方式实现:

    ^From:\s.(?P<from>.+)\R   # look for "From:" at the beginning of the line/string,
                               # followed by a capturing group and `R`
    Sent:\s(?P<sent>.+)\R      # same as above  
    To:\s(?P<to>.+)\R
    Subject:\s(?P<subject>.+)
    

    如果使用PCRE(即PHP等),代码就可以工作
    参见a demo here on regex101.com(带有mx标志)

  2. # 2 楼答案

    你可以用这样的东西

    From:.+\nSent:.+\nTo:.+\nSubject:.+

    您提供的正则表达式可能会失败,因为您不需要起始.*,因为您希望从“from:”部分捕获

    如果你只想捕捉文本

    From:(.+)\nSent:(.+)\nTo:(.+)\nSubject:(.+)

    在哪里

    1美元->;来自文本

    $2->;发送文本

    3美元->;发短信

    4美元->;主题文本

    您可以使用任何使用任何语言的函数的正则表达式来获取这些捕获的组

  3. # 3 楼答案

    在我看来,你可以使用这样的正则表达式:

    /^(?=From: ).*([\r\n]|\r\n)(?=Sent: ).*([\r\n]|\r\n)(?=To: ).*([\r\n]|\r\n)(?=Subject: ).*$/gm
    

    [Regex Demo]

  4. # 4 楼答案

    由于两个可能的原因,您的正则表达式不起作用:

    • 换行序列可以是\r\n、或\r、或\n(甚至更多,\u000B\u000C\u0085\u2028\u2029),但您只在LF中编码。添加可选的CR(回车,\r)会有所帮助
    • 另外,在Subject:...之后,没有换行符,所以需要删除它
    • 在Java8+中,有一个special line break shorthand class, ^{},可以用来匹配任何换行序列

    你可以用

    From:.+\r?\nSent:.+\r?\nTo:.+\r?\nSubject:.+
    From:.+\RSent:.+\RTo:.+\RSubject:.+
    

    Matcher#find()搜索部分匹配项

    参见regex demo

    以及IDEONE demo

    String p = "From:.+\r?\nSent:.+\r?\nTo:.+\r?\nSubject:.+"; 
    // String p = "From:.+\\RSent:.+\\RTo:.+\\RSubject:.+";  // Java 8+ compliant
    String s = "Some text before.....\r\nFrom: ***********************\r\nSent: ***********************\r\nTo: ***********************\r\nSubject: *******************"; 
    Pattern pattern = Pattern.compile(p);
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()){
        System.out.println(matcher.group(0)); 
    }