我有这样的字符串变体:
杰克1989年6月303日 或者字符串可以 JEFF 303 1989年6月我正在使用reg来匹配它,并希望使用组名,以便我始终知道我正在提取的数据。如果字符串是JEFF 303 1989 JUNE,那么我有一个reg ex可以确保1989和JUNE可以在第3和第4组中,但是如果字符串是1989年6月的JEFF,它将6月放在第3组和1989年的第4组中。我希望避免这种情况,并确保通过组名或组号提取它。
到目前为止,我已经编写了代码。
final String regex ="^(?<name>[a-z]+)[ :-]?(?<id>\\d+)\\s((?<month>[a-z]+)|(?<year>\\d+))?((?<=[a-z] {0,1})\\d+|(?<=\\d {0,1})(?<month>[a-z]+))$";
final String string = "JEFF 303 JUNE 1989";
final String string1 = "JEFF 303 1989 JUNE";
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(string);
matcher.find();
String nameGroup = matcher.group("name");
String id = matcher.group("id");
String month = matcher.group("month");
String year = matcher.group("year");
答案 0 :(得分:1)
如果使用命名捕获组,我认为您不能在替换|
的每一侧使用相同的组名。你能用2个正则表达式吗?
public static boolean findMatch(String regex, String input) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
String name = matcher.group("name");
String id = matcher.group("id");
String month = matcher.group("month");
String year = matcher.group("year");
// just print it out, maybe you want to return it instead
System.out.printf("name: %s, id: %s, month: %s, year: %s", name, id, month, year);
return true;
}
return false;
}
public static void main(String[] args) {
String input = "JEFF 303 JUNE 1989";
//String input = "JEFF 303 1989 JUNE";
// I simplified the regexes
String regex1 = "(?<name>\w+) (?<id>\d+) (?<month>\w+) (?<year>\d+)";
String regex2 = "(?<name>\w+) (?<id>\d+) (?<year>\d+) (?<month>\w+)";
if(findMatch(regex1, input)) {
// found it with first regex
} else if(findMatch(regex2, input)) {
// found it with second regex
} else {
// didn't match
}
}