Java读取字符串的一部分

Java读取字符串的一部分,java,string,javabeans,Java,String,Javabeans,我有以下案文: <message id="dsds" to="test@test.com" type="video" from="test@test"><body>TESTTESTTEST</body><active xmlns="http://jabber.org"/></message> 我想得到这个字符串中的部分 在java中,我搜索并找到了split,但它不能解决我的问题。如何在java中获取中间文本?使用regx包:

我有以下案文:

   <message id="dsds" to="test@test.com" type="video" from="test@test"><body>TESTTESTTEST</body><active xmlns="http://jabber.org"/></message>
我想得到这个字符串中的部分

在java中,我搜索并找到了split,但它不能解决我的问题。如何在java中获取中间文本?

使用regx包:

输出:testtest

使用regx包:


输出:testtest

在这种特定情况下,我建议您将正则表达式用于

可能的解决办法:

在这种情况下,我建议您将正则表达式用于

可能的解决办法:

像这样使用正则表达式:既适用于asas asasa,也适用于asasa


像这样使用正则表达式:适用于asas asasa以及


您可以这样编写代码-

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));

它将打印预期的结果。

您可以这样编写代码-

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));
它将打印预期结果。

最好使用SAXParser或DocumentBuilder之类的解析器。您可以准确地获取标签并处理数据。当您有许多标记要处理时,它们将特别方便

下面是使用解析器读取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);
最好使用SAXParser或DocumentBuilder之类的解析器。您可以准确地获取标签并处理数据。当您有许多标记要处理时,它们将特别方便

下面是使用解析器读取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);

通过正则表达式解决这个问题的答案已经给出,尽管XML解析器可能是更好的选择

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

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

您可以使其非贪婪,这将导致运行时间的改进。原始正则表达式的问题是。*将继续匹配到字符串的末尾,然后它将回溯。[^>]将在看到直角括号后立即停止。我运行了一个简单的测试,比较了两个正则表达式。贪婪的一个需要3倍于非贪婪的时间。

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

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

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


您可以使其非贪婪,这将导致运行时间的改进。原始正则表达式的问题是。*将继续匹配到字符串的末尾,然后它将回溯。[^>]将在看到直角括号后立即停止。我运行了一个简单的测试,比较了两个正则表达式。贪婪的一个所用的时间是非贪婪的三倍。

是否要解析XML?您想要字符串的哪一部分?@JamesFox可能取决于:@詹姆斯·福克斯;在我想得到的世界里@帕特里克;不,它不是xml,它是我的字符串数据。看看:哪一个是java html解析器。你想解析xml吗?你想解析字符串的哪一部分?@JamesFox可能取决于:@詹姆斯·福克斯;在我想得到的世界里@帕特里克;不,它不是xml,它是我的字符串数据。请看一下:这是一个java html解析器。注意:如果body标记中有任何属性或只有空格,它将不起作用。@Thilo,那么她/他可以使用。*?而不是模式中的\\S+。\n如果body标记有任何属性或只有空格,则警告:无效。@Thilo然后她/他可以使用。*?而不是模式中的\\S+,您在回答之前看到答案了吗?与我的答案相同,但9分钟后!:@FarhangAmary-您的答案是否适用于我提供的输入?。像asas asasa这样的输入。请查收。另外,我的正则表达式也不一样。如果这有帮助的话,我看到了你的答案并同意Thilo的观点。好吧,你的正则表达式有点不对劲。。它包含奇数个引号。在我看来,如果body标记包含空格或属性,它也会失败。@Tom-纠正了它。。这是个打字错误。谢谢。。你能给我一个可能失败的示例输入吗?@TheLostMind检查我对最后一条评论的编辑:P。我已经注意到:。你在回答之前看到答案了吗?与我的答案相同,但9分钟后!:@FarhangAmary-您的答案是否适用于我提供的输入?。像asas asasa这样的输入。请查收。另外,我的正则表达式也不一样。如果这有帮助的话,我看到了你的答案并同意Thilo的观点。好吧,你的正则表达式有点不对劲。。它包含奇数个引号。在我看来,如果body标记包含空格或属性,它也会失败。@Tom-纠正了它。。这是个打字错误。谢谢。。你能给我一个可能失败的示例输入吗?@TheLostMind检查我对最后一条评论的编辑:P。我已经注意到:。你应该在你的答案中包含链接的重要部分。如果链接无效,那么您的答案将毫无意义,应该避免。该链接指向可能重复的问题/解决方案。我应该在我的答案中包含另一个堆栈溢出答案中的重要部分吗?要么这样,要么将此问题标记为发现问题的可能副本。最后一种方法更好。好的,很好。非常感谢。你应该在你的答案中包含链接的重要部分。如果链接变得无效
你的答案将毫无意义,应该避免。链接指向可能重复的问题/解决方案。我应该在我的答案中包含另一个堆栈溢出答案中的重要部分吗?要么这样,要么将此问题标记为发现问题的可能副本。最后一种方法更好。好的,很好。非常感谢。