有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个输入,比如:

<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) 个答案

  1. # 1 楼答案

    通常,您应该而不是使用regex解析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

    要使用BufferedReader进行此操作,您可能必须确保一次读入一个完整的<address>标记

  2. # 2 楼答案

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

    。。。。。。 算法一定是这样的。如果你看了文件

  3. # 3 楼答案

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

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