2013-03-25 5 views
1

У меня есть строка сказать:Извлечение подстроки из строки - регулярное выражение

<encoded:2,Message request> 

Теперь я хочу, чтобы извлечь 2 и Message request из предыдущей строки.

private final String pString = "<encoded:[0-9]+,.*>"; 
    private final Pattern pattern = Pattern.compile(pString); 

    private void parseAndDisplay(String line) { 

     Matcher matcher = pattern.matcher(line); 
     if (matcher.matches()) { 
      while(matcher.find()) { 
       String s = matcher.group(); 
       System.out.println("=====>"+s); 

      } 
     } 
    } 

Это не извлекает его. Что случилось с ним

ответ

6

Вы должны определить группы в своем регулярном выражении:

"<encoded:([0-9]+),(.*?)>" 

или

"<encoded:(\\d+),([^>]*)" 
+0

В Java, чтобы передать \ буквальным он должен быть записан в виде \\. Так \ d должно быть \\ d. В любом случае +1. – Pshemo

+0

оба не работали – Jatin

+2

@ Jatin вам нужно захватить группы. Вместо этого 'group()' use 'group (1)' и 'group (2)'. – Pshemo

0

Попробуйте

"<encoded:([0-9]+),([^>]*)" 

Кроме того, как было предложено в других комментариях, использование group(1) и group(2)

4

попробовать

String s = "<encoded:2,Message request>"; 
    String s1 = s.replaceAll("<encoded:(\\d+?),.*", "$1"); 
    String s2 = s.replaceAll("<encoded:\\d+?,(.*)>", "$1"); 
+0

лучше использовать replaceFirst? – MozenRath

+0

Он тоже работает, но я не думаю, что это имеет значение в этой ситуации –

+0

, если запрос на сообщение содержал аналогичный тег innner, он не сработает правильно? – MozenRath

0

Попробуйте это:

  Matcher matcher = Pattern.compile("<encoded:(\\d+)\\,([\\w\\s]+)",Pattern.CASE_INSENSITIVE).matcher("<encoded:2,Message request>"); 

    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2)); 
    } 
Смежные вопросы