【问题标题】:Parse Text using scanner useDelimiter使用扫描仪 useDelimiter 解析文本
【发布时间】:2011-02-25 12:34:23
【问题描述】:

希望解析以下文本文件:
示例文本文件:

<2008-10-07>text entered by user<Ted Parlor><2008-11-26>additional text entered by user<Ted Parlor>

我想解析上面的文本,这样我就可以拥有三个变量:

v1 = 2008-10-07
v2 = text entered by user
v3 = Ted Parlor
v1 = 2008-11-26
v2 = additional text entered by user
v3 = Ted Parlor

我尝试使用扫描仪和 useDelimiter,但是,我遇到了如何设置它以获得上述结果的问题。这是我的第一次尝试:

import java.io.*;
import java.util.Scanner;

public class ScanNotes {
    public static void main(String[] args) throws IOException {
        Scanner s = null;
        try {
            //String regex = "(?<=\\<)([^\\>>*)(?=\\>)";
            s = new Scanner(new BufferedReader(new FileReader("cur_notes.txt")));
            s.useDelimiter("[<]+");

            while (s.hasNext()) {
                String v1 = s.next();
                String v2= s.next();
                System.out.println("v1= " + v1 + " v2=" + v2);
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
    }
}

结果如下:

v1= 2008-10-07>text entered by user v2=Ted Parlor> 

我想要的是:

v1= 2008-10-07 v2=text entered by user v3=Ted Parlor
v1= 2008-11-26 v2=additional text entered by user v3=Ted Parlor

任何可以让我分别提取所有三个字符串的帮助将不胜感激。

【问题讨论】:

    标签: java regex string parsing java.util.scanner


    【解决方案1】:

    您可以使用\s*[&lt;&gt;]\s* 作为分隔符。也就是说,&lt;&gt; 中的任何一个,带有任何前后空格。

    为此,输入中不得有任何&lt;&gt;,除了用于在输入中标记日期和用户字段(即消息中没有I &lt;3 U!!)。

    此分隔符允许条目中有空字符串部分,但它也会在任意两个条目之间留下空字符串标记,因此必须手动丢弃它们。

    import java.util.Scanner;
    
    public class UseDelim {
        public static void main(String[] args) {
            String content = " <2008-10-07>text entered by user <Ted Parlor>"
            + "   <2008-11-26>  additional text entered by user <Ted Parlor>"
            + "   <2008-11-28><Parlor Ted>  ";
            Scanner sc = new Scanner(content).useDelimiter("\\s*[<>]\\s*");
            while (sc.hasNext()) {
                System.out.printf("[%s|%s|%s]%n",
                    sc.next(), sc.next(), sc.next());
    
                // if there's a next entry, discard the empty string token
                if (sc.hasNext()) sc.next();
            }
        }
    }
    

    打印出来:

    [2008-10-07|text entered by user|Ted Parlor]
    [2008-11-26|additional text entered by user|Ted Parlor]
    [2008-11-28||Parlor Ted]
    

    另见

    【讨论】:

    • 太好了,感谢您的出色回应。还有一个问题,关于标签 前后的空格。例如,如果我的数据如下所示,结果将中断: String content = " 用户 输入的文本" + " 用户 ";也许我应该在之前指出这一点。简而言之,在考虑 标签前后可能存在空格的同时,我将如何获得与您输出的结果相同的结果。非常感谢。
    • 我在内容上使用了以下内容: content = content.replaceAll("\\s+
    • 我将如何处理两个标签之间没有文本的情况:“” *** 这会破坏字段的顺序。此异常的预期结果将是: [2008-10-07||Ted Parlor|] 第二个值只是留空,并按照您在上面的代码中提供的顺序维护。不确定这是可能的。干杯,感谢您的意见。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多