当输入字符串可以更改顺序时,在Java正则表达式中按名称提取组

时间:2018-02-07 23:13:53

标签: java regex

我有这样的字符串变体:

杰克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");

1 个答案:

答案 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
  }
}