基于这里的一堆回复: Capturing Part of String和 Using 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
有谁能看到我在这里做错了什么?
答案 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