2015-01-07 4 views
1

У меня есть этот текст:Java прочитать часть строки

<message id="dsds" to="[email protected]" type="video" from="[email protected]"><body>TESTTESTTEST</body><active xmlns="http://jabber.org"/></message> 

И я хочу, чтобы получить часть <body></body> в этой строке.

В java, я ищу и нашел раскол, но он не может решить мою проблему. Как я могу получить текст между <body></body> в java?

+2

Вы хотите разобрать XML? –

+0

Какую часть строки вы хотите? –

+0

@JamesFox Наверное, зависит. :) –

ответ

1

Использование regx пакет:

String htmlString = "<message id=\"dsds\" to=\"[email protected]\" type=\"video\" from=\"[email protected]\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>"; 
    String bodyText=""; 
    Pattern p = Pattern.compile("<body.*>(.*?)</body.*>"); 
    Matcher m = p.matcher(htmlString); 

    if (m.find()) { 
     bodyText = m.group(1); 
    } 
    System.out.println(bodyText); 

ВЫВОД:TESTTESTTEST

+3

Предостережение: не работает, если тег тела имеет какие-либо атрибуты (или просто пробелы в нем). – Thilo

+0

@Thilo, то он/она может использовать ** (. *?) ** вместо ** (\\ S +) ** внутри шаблона – jfun

1

В этом конкретном случае, я рекомендую вам использовать регулярные выражения с Matcher

Возможным решением: Java regex to extract text between tags

+2

Вы должны включить существенные части своих ссылок в свой ответ. Если ссылка становится недействительной, ваш ответ будет бессмыслен, и этого следует избегать. – Tom

+0

Ссылка на возможный дублированный вопрос/решение. Должен ли я включать «существенные части» из другого ответа на переполнение стека в моем ответе? – jmartins

+1

Либо это, либо обозначить этот вопрос как возможный дубликат вашего найденного вопроса (последний подход лучше). – Tom

2

использование регулярных выражений, как это: (работает <body>asas asasa </body>, а также <body> </body>

public static void main(String[] args) { 
    String s = "<message id=\"dsds\" to=\"[email protected]\" type=\"video\" from=\"[email protected]\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>"; 
    Pattern p = Pattern.compile("<body.*>(.*?)</body>"); 
    Matcher m = p.matcher(s); 
    while (m.find()) { 
     System.out.println(m.group(1)); 
    } 
} 

O/P:

TESTTESTTEST 
+0

Вы уже видели ответы, прежде чем отвечать? то же, что и мой ответ, но через 9 минут! :) – jfun

+1

@FarhangAmary - Ваш ответ работает на входы, которые я предоставил ?. Входы типа ' asas asasa'. Пожалуйста, проверьте. Кроме того, мое * regex * отличается. И если это поможет, я увидел ваш ответ и * согласился * с Тило. – TheLostMind

+0

Вы его отредактировали, я отредактирую его также – jfun

1

Вы можете написать код, как this-

String s = "<message id=\"dsds\" to=\"[email protected]\" type=\"video\" from=\"[email protected]\"><body>TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>";//Use '/' character as escape for " 
     int firstIndex = s.indexOf("<body>"); 
     int lastIndex = s.indexOf("</body>"); 
     System.out.println(s.substring(firstIndex+6, lastIndex)); 

И он напечатает ожидаемый результат.

4

Использование Parser как SAXParser или DocumentBuilder намного предпочтительнее. Вы можете точно получать теги и обрабатывать данные. Они будут особенно удобны, если у вас много меток для обработки.

Ниже приведен пример использования Parser, чтобы прочитать тело тега:

 SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 
     DefaultHandler handler = new DefaultHandler(){ 

      String body = ""; 
      boolean isBody = false; 

      @Override 
      public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

       if (qName.equalsIgnoreCase("body")) { 
        isBody = true; 
       } 
      } 

      @Override 
      public void characters(char[] ch, int start, int length) throws SAXException { 
       if (isBody) { 
        body = new String(ch, start, length); 
        System.out.println("body : " + body); 
       } 
      } 

      @Override 
      public void endElement(String uri, String localName, String qName) throws SAXException { 
       if (qName.equalsIgnoreCase("body")) { 
        isBody = false; 
       } 
      } 
     }; 

     saxParser.parse(new InputSource(new StringReader("<message id=\"dsds\" to=\"[email protected]\" type=\"video\" from=\"[email protected]\"><body id=\"dd\">TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>")), handler); 
0

Ответ уже дан для ее решения с помощью регулярных выражений (хотя XML-парсер, возможно, был лучший выбор).

Давать простое предложение изменить регулярное выражение, предложенное в вышеуказанных растворах:

Regex proposed: (<body.*>(.*?)</body.*>) => This regex is greedy. 
Non greed regex: <body[^>]*>(.*?)</body[^>]*> 

Вы можете сделать это, не жадный, что приведет к улучшению времени работы. Проблема с оригинальным регулярным выражением заключается в том, что. * Будет продолжать соответствовать до конца строки, а затем будет возвращаться. «[^>]» останавливается, как только он видит прямоугольную скобку. Я проверил простой тест, сравнивающий оба регулярных выражения. Жадность занимает 3 раза больше времени, затраченного не жадными.

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