Java 使用模式匹配器的正则表达式没有正确返回?

Java regex using pattern matcher not returning correctly?

我必须从以下字符串中获取索引值:

Home.number[12].parent. 

我想取回值 12。

这是我尝试过的:

//escape . / [ ]
 private static final String pattern = "Home\.number\[([0-9]*)\]*";
 private static final Pattern addressPattern = Pattern.compile(pattern);

   private static int getIndex(String input, Pattern pattern){

        Matcher m = pattern.matcher(input);
        if (m.matches()){
        return Integer.valueOf(m.group(2));
        }
        return -1;
    }

    public static void main(String[] args){

    System.out.println(getIndex("Home.number[123].parent", addressPattern);
    System.out.println(getIndex("Home.number[456].child", addressPattern);   
}

我返回 -1 两个,这意味着没有找到匹配项。

使用调试器,我发现 m.matches() 正在返回 false。 我想不通为什么。

P.S:我也尝试过使用 Pattern.quote("Home.number[([0-9]*])*")StringUtils.EscapeJava("Home.number[([0-9]*)]*")。两者均未返回任何匹配结果。

  1. 将模式从:"Home\.number\[([0-9]*)\]*" 更改为 "Home\.number\[([0-9]+)\].*"(在最后一个 * 之前添加点)
  2. 将组更改为 #1:return Integer.valueOf(m.group(1));
  3. System.out.println() 调用中添加右括号。

像这样:

private static final String pattern = "Home\.number\[([0-9]*)\].*";
private static final Pattern addressPattern = Pattern.compile(pattern);

private static int getIndex(String input, Pattern pattern){
  Matcher m = pattern.matcher(input);
  if (m.matches()){
    return Integer.valueOf(m.group(1));
  }
  return -1;
}

public static void main( String[] args ){
  System.out.println(getIndex("Home.number[123].parent", addressPattern));
  System.out.println(getIndex("Home.number[456].child", addressPattern));   
}

你的Pattern应该看起来像

private static final String pattern = "Home\.number\[(\d+)\]\..*";
private static final Pattern addressPattern = Pattern.compile(pattern);

而你的匹配器只有 1 个组。

private static int getIndex(String input, Pattern pattern) {
    Matcher m = pattern.matcher(input);
    if (m.matches()) {
        return Integer.parseInt(m.group(1));
    }
    return -1;
}

并且您需要在 main 的调用中关闭第二个括号。像

public static void main(String[] args) {
    System.out.println(getIndex("Home.number[123].parent", addressPattern));
    System.out.println(getIndex("Home.number[456].child", addressPattern));
}

当我进行这些更改时,我得到了预期的结果

123
456

如果你删除除了方括号之间的所有内容,你可以在一行中完成:

private static int getIndex(String input) {
    return input.matches(".*\[\d+].*") ? -1 : Integer.parseInt(input.replaceAll(".*\[|].*", ""));
}