繁体   English   中英

使用模式匹配器的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 我不知道为什么。

PS:我也尝试使用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(".*\\[|].*", ""));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM