2015-12-23 2 views
2

Я пытаюсь получить первый матч за номер в скобках и рассчитываю получить 123, но:Получить первую группу регулярных выражений в Java

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

Что-то подсказывает мне, что '' ... может содержать какую-то важную информацию. Опубликуйте минимальный, но полный код, который позволит нам воспроизвести вашу проблему. – Pshemo

+0

Почему бы вам просто не разделить строку с пробелом, а затем вернуть индекс 1 с регулярным выражением '[0-9]'. – OPK

+0

Несомненно. Это мой первый пост, поэтому я сделал некоторые ошибки. –

ответ

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 
+0

Спасибо.Это помогло –

+1

, возможно, вы захотите его подкрепить и принять, если он решит вашу проблему. Это наш способ сказать: «Спасибо, это помогло»;) проверить основные рекомендации там: http://stackoverflow.com/tour – jopasserat

+0

@jopasserat OP еще не может проголосовать (ему требуется 15 репутации: http://stackoverflow.com/help/privileges/vote-up). Но вы правы в принятии ответа. – Pshemo

2

Проблема с регулярным выражением является то, что по умолчанию * квантификатор равен 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 
    } 
} 
+0

Благодарим вас за подробное объяснение. Это полезно. –

+0

@PavelGlushchenko Добро пожаловать. Если что-то неясно, не стесняйтесь спрашивать подробности. – Pshemo