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

时间:2015-07-08 23:38:43

标签: java regex regex-group

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

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]*)]*")。两者都没有返回任何匹配的结果。

3 个答案:

答案 0 :(得分:3)

您的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 :(得分:1)

  1. 将模式从:Store,Product a, 1 a, 2 b, 3 b, 2 c, 3 c, 1 d, 1 d, 2 d, 3 更改为Store,Store Replacement a,- b,- c,- d,a (在最后"Home\\.number\\[([0-9]*)\\]*"之前添加点数)
  2. 将论坛更改为#1:"Home\\.number\\[([0-9]+)\\].*"
  3. *来电中添加右括号。
  4. 像这样:

    return Integer.valueOf(m.group(1));

答案 2 :(得分:1)

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

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