Проблема с регулярным выражением является то, что по умолчанию *
квантификатор равен 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
}
}
Что-то подсказывает мне, что '' ... может содержать какую-то важную информацию. Опубликуйте минимальный, но полный код, который позволит нам воспроизвести вашу проблему. – Pshemo
Почему бы вам просто не разделить строку с пробелом, а затем вернуть индекс 1 с регулярным выражением '[0-9]'. – OPK
Несомненно. Это мой первый пост, поэтому я сделал некоторые ошибки. –