在Java中获取第一组正则表达式

时间:2015-12-23 16:19:33

标签: java regex

我试图在括号中获得数字的第一场比赛并期望获得123,但是:

String str = "ABC 123-(456)-(789)";
String regex = ".*\\((\\d+)\\).*";

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
m.find();

System.out.println(m.group(1)); // "789"

请帮忙。

我找到了解决方法,但没有匹配器:

String[] arr = str.split("[\\(\\)]");
for (String s : arr) {
    if (s.matches("[-+]?\\d+")) {
        return s;
    }
}

2 个答案:

答案 0 :(得分:3)

你的正则表达式的问题是默认情况下*量词是greedy,这意味着它会尝试尽可能多地匹配。由于您将其与.*一起使用,这意味着它会尝试匹配任何字符的最大值,因为这是.所代表的内容(除了行分隔符)。

所以你的正则表达式.*\((\d+)\).*将匹配

           ABC 123-(456)-(789)
.*        -^^^^^^^^^^^^^^
((\d+)\)  ---------------^^^^^
.*        -empty

要更改*的行为并将其reluctant添加为? .*?

但在您的情况下,您似乎应该从正则表达式中删除.*,因为您可能实际上并不想匹配他们描述的部分。所以试试

String regex = "\\((\\d+)\\)";

对于像"ABC 123-(456)-(789)"这样的字符串,您应该得到结果456 - 因为它是匹配此正则表达式的第一个结果。要移至文字结果789,您需要再次使用find方法。

所以你的代码看起来像:

private static final Pattern p = Pattern.compile("\\((\\d+)\\)");
//we make Pattern static field since to avoid recompiling
//same pattern each time we call our method
static String myFind(String text){
    Matcher m = p.matcher(text);
    if (m.find()){
        return m.group(1);
    }else{
        return null;//or empty string, or maybe throw exception
    }
}

答案 1 :(得分:0)

尝试这样的正则表达式\\b((?<number>\\d+)\\b)

String str = "ABC (123) (456) (678)" ;
Pattern p = Pattern.compile("\\b((?<number>\\d+)\\b)");
Matcher m = p.matcher(str);
m.find();
System.out.println(m.group());

输出:

123