为了账号安全,请及时绑定邮箱和手机立即绑定

使用 StringUtils 的 substringBetween() 方法获取两个标签之间的文本

使用 StringUtils 的 substringBetween() 方法获取两个标签之间的文本

MYYA 2021-12-01 19:58:40
我有一个输入,如:<address>    <addressLine>280 Flinders Mall</addressLine>    <geoCodeGranularity>PROPERTY</geoCodeGranularity></address><address type="office">    <addressLine>IT Park</addressLine>    <geoCodeGranularity>office Space</geoCodeGranularity></address>我想捕获地址标签之间的所有内容。我试过:File file = new File("test.html");String testHtml = FileUtils.readFileToString(file); String title = StringUtils.substringBetween(testHtml, "<address>", "</address>");这并不适用于所有情况,因为地址标签可能包含一些属性。请帮助如何获取此类字符串的文本。
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

一般来说,你应该不使用正则表达式来解析HTML / XML的内容。相反,使用像 XPath 这样的解析器。鉴于您似乎无法使用解析器,我们可以使用模式匹配器尝试以下选项:


int count = 0;

String input = "<address>\n<addressLine>280 Flinders Mall</addressLine>\n    <geoCodeGranularity>PROPERTY</geoCodeGranularity>\n</address>\n<address type=\"office\">\n    <addressLine>IT Park</addressLine>\n    <geoCodeGranularity>office Space</geoCodeGranularity>\n</address>";

String pattern = "<address[^>]*>(.*?)</address>";

Pattern r = Pattern.compile(pattern, Pattern.DOTALL);

Matcher m = r.matcher(input);


while (m.find( )) {

    count += m.group(1).length();

    System.out.println("Found value: " + m.group(1) );

}


System.out.println("count = " + count);  

这会为<address>您的示例数据中的两个标签找到 198 的计数。


要使用 a 进行这项工作,BufferedReader您可能必须确保一次读取一个完整的<address>标签。


查看完整回答
反对 回复 2021-12-01
?
BIG阳

TA贡献1859条经验 获得超6个赞

您可以将文件转换为字符串,并可以确定所需子字符串的开始和结束索引,如下所示:


import java.io.File;

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Paths;


public class Address {


    public static void main(String[] args) throws IOException {


        // Complete File Path

        File dir =

            new File("\\..\\..\\Test.html");


        // Convert File Data As String

        String data =

            new String(

                Files.readAllBytes(Paths

                    .get(dir

                        .getAbsolutePath())));


        // For Loop to get all the <address> tags in the file.

        for (int index = data.indexOf("<address"); index >= 0;) {


            // Start Index

            int startIndex = data.indexOf(">", index + 1);

            ++startIndex;


            // End Index

            int indexOfEnd = data.indexOf("</address>", startIndex + 1);


            String attributesString = data.substring(startIndex, indexOfEnd);

            // Replace below line with desired logic with calling trim() on the String attributesString

            System.out.println(attributesString);


            // Next Address will be after the end of first address

            index = data.indexOf("<address", indexOfEnd + 1);

        }

    }

}


查看完整回答
反对 回复 2021-12-01
?
慕神8447489

TA贡献1780条经验 获得超1个赞

while (scan.hasNextLine()) {


        parser = scan.nextLine();

        // System.out.println(parser);

        if (parser.equals("<adress>")) {

            parser = scan.nextLine();

            // System.out.println(parser);

            int startPosition = parser.indexOf("<adressLine>") + "<adressLine>".length();

            int endPosition = parser.indexOf("</adressLine>", startPosition);

            idNumber = parser.substring(startPosition, endPosition);

            parser = scan.nextLine();


            int startPosition1 = parser.indexOf("<geoCodeGranularity>") + "<geoCodeGranularity>".length();

            int endPosition1 = parser.indexOf("</geoCodeGranularity>", startPosition1);

            time = parser.substring(startPosition1, endPosition1);

            parser = scan.nextLine();

…… 算法一定是这样的。如果你阅读文件。


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 1722 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信