2015-02-09 3 views
0

У меня есть строка hhht. Мне нужно grep 12121212 & 56565656 из строки. То, что я пробовал до сих пор, показано ниже.Java Regex для первого соответствия String

String hhht = "dhdhdh<a:Rakesh>12121212</a:Rakesh>sdsdvsdvsvvsv"+"sfsf"+"<a:Rakesh>56565656</a:Rakesh>zvnbjvbj"; 

Pattern pattern = Pattern.compile("<a:Rakesh>(.+)</a:Rakesh>"); 
Matcher matcher = pattern.matcher(hhht); 

for(int hh = 0 ;hh <matcher.groupCount(); hh++){ 
    if(matcher.find()) 
     System.out.println(matcher.group(hh+1)); 

} 

Я получил вывод, как,

12121212</a:Rakesh>sdsdvsdvsvvsvsfsf<a:Rakesh>56565656 

т.е., шаблон согласования с первым <a:Rakesh> тега.

ответ

1

У вас есть жадный сокет, который не ограничивается соответствующими номерами. Это означает, что он будет соответствовать как можно больше. Поскольку у вас есть два совпадающих тега, он захватывает каждый символ между открытием первого тега и закрытием второго тега.

Вы можете сделать это не жадным (он будет остановлен как можно раньше, остановившись при первом </a:Rakesh>) или сделайте это только номерами совпадений (которые не будут соответствовать </a:Rakesh>, останавливаясь в этой точке).

Это соответствует только цифры:

"<a:Rakesh>(\\d+)</a:Rakesh>" 

Это не жадный подход:

"<a:Rakesh>(.+?)</a:Rakesh>" 
2
  1. Использование нежадным регулярное выражение с DOTALL флагом:

    Pattern pattern = Pattern.compile("(?s)<a:Rakesh>(.+?)</a:Rakesh>"); 
    
  2. И вы не можете получить matcher.groupCount() перед вызовом find

Используйте его, как это

if(matcher.find()) { 
    for(int hh = 0; hh <= matcher.groupCount(); hh++){ 
     System.out.println(matcher.group(hh+1));  
    } 
} 
1

Это зависит от greeding соответствия: Возьмите эту модель:

Pattern pattern = Pattern.compile("<a:Rakesh>(.+?)</a:Rakesh>"); 

Для более информация look this thread.

И вы должны использовать время цикла:

while (matcher.find()) { 
      System.out.println(matcher.group(1)); 

    }  
Смежные вопросы