Java Regex:将字符串的多个部分作为子字符串

时间:2014-04-14 05:56:03

标签: java regex string

基于这里的一堆回复: Capturing Part of StringUsing Java to find substring of a bigger string using Regular Expression

我试图将字符串的多个部分作为子串:

import java.io.File;
import java.util.regex.*;

String subject = "Re: New Mail File Alert: MAIL_20140320_0000000002.dat XYZ";

Pattern p = Pattern.compile("^(Re|Fwd?)(.*)(New Mail File Alert: )(MAIL_)((20)\\d\\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[_](\\d{10})(\\.)(dat|ctl)(\\s)(XYZ|ABC)$");
Matcher m = p.matcher(subject);

if (m.find()){
   String file = subject.replaceAll("(MAIL_)((20)\\d\\d)(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[_](\\d{10})", "$1");
   String path = subject.replaceAll("(XYZ|ABC)$", "$1");
}

我想要的位是:" MAIL_20140320_0000000002"和" XYZ"但是我回来的字符串是:

file: Re: New Mail File Alert: MAIL_.dat XYZ
path: Re: New Mail File Alert: MAIL_20140320_0000000002.dat XYZ

有谁能看到我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

以下作品

New Mail File Alert: ([^.]*)\\.dat (.*)$

这匹配两组:

 1. MAIL_20140320_0000000002
 2. XYZ

答案 1 :(得分:0)

import java.io.File;
import java.util.regex.*;   

String subject = "Re: New Mail File Alert: MAIL_20140320_0000000002.dat XYZ"; 

String file = null;
String path = null;
    try {
        Pattern regex = Pattern.compile("(MAIL[\\d_]+).*?\\s+(.*?)$", Pattern.DOTALL | Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
        Matcher regexMatcher = regex.matcher(subject);
        try {
        file = regexMatcher.replaceAll("$1");
        path = regexMatcher.replaceAll("$2");
        } catch (IllegalArgumentException ex) {
            // Syntax error in the replacement text (unescaped $ signs?)
        } catch (IndexOutOfBoundsException ex) {
            // Non-existent backreference used the replacement text
        } 
    } catch (PatternSyntaxException ex) {
        // Syntax error in the regular expression
    }

答案 2 :(得分:0)

我认为没有理由使用正则表达式替换匹配的String中的任何部分。只需从相应的Matcher组中提取值。

String file = m.group(4) + m.group(5) + m.group(7) + m.group(8)
                + "_" + m.group(9);
String path = m.group(13);

System.out.println(file);
System.out.println(path);

打印

MAIL_20140320_0000000002
XYZ