Java读取字符串的一部分

时间:2015-01-07 11:41:04

标签: java string javabeans

我有这样的文字:

   <message id="dsds" to="test@test.com" type="video" from="test@test"><body>TESTTESTTEST</body><active xmlns="http://jabber.org"/></message>

我希望在此字符串中获得<body></body>的一部分。

在java中,我搜索并发现分裂,但它无法解决我的问题。如何在java中的<body></body>之间获取文本?

6 个答案:

答案 0 :(得分:4)

使用像 SAXParser DocumentBuilder 之类的解析器是首选。您可以准确地获取标签并处理数据。当你有许多要处理的标签时,它们会特别方便。

以下是使用Parser读取body标签的示例:

        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=\"test@test.com\" type=\"video\" from=\"test@test\"><body id=\"dd\">TESTTESTTEST</body><active xmlns=\"http://jabber.org\"/></message>")), handler);

答案 1 :(得分:2)

使用这样的正则表达式:(适用于<body>asas asasa </body>以及<body> </body>

public static void main(String[] args) {
    String s = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><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

答案 2 :(得分:1)

使用 regx 包:

    String htmlString = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><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 :(得分:1)

在这种特定情况下,我建议您使用Matcher的正则表达式

可能的解决方案: Java regex to extract text between tags

答案 4 :(得分:1)

你可以写这样的代码 -

String s = "<message id=\"dsds\" to=\"test@test.com\" type=\"video\" from=\"test@test\"><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));

它将打印预期结果。

答案 5 :(得分:0)

已经给出了通过正则表达式解决它的答案(尽管XML解析器可能是更好的选择)。

给出一个简单的建议来修改上述解决方案中提出的正则表达式:

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

你可以使它变得非贪婪,这将导致运行时间的改善。原始正则表达式的问题是。*将继续匹配直到字符串结束然后它将回溯。 &#34; [^&GT;]&#34;一旦看到右尖括号,它就会停止。我运行了一个比较正则表达式的简单测试。贪婪的是非贪婪时间的3倍。