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



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

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]*)]*")

您的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
  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));   
}

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

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

最新更新