我试图在括号中获得数字的第一场比赛并期望获得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;
}
}
答案 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