【问题标题】:Regex in scanner only finds first match扫描仪中的正则表达式仅找到第一个匹配项
【发布时间】:2014-12-15 19:20:41
【问题描述】:

我有一个文本文件,其中包含我需要解析的一些文章。

我需要检索每篇文章中的每个单词,不包括句号、逗号等。文章由特定的两行分隔,我正在尝试使用正则表达式模式来查找这些点。

文档示例如下:

.I 1
.W
this is article one.         
.I 2
.W
this is article two.                   
.I 3
.W
this is article three. 

下面的代码似乎找到了第一次出现的.I 1 并添加了所有后续单词,但是一旦到达下一个分隔符,它会将其添加为单词而不是跳过它。

Scanner scanner = new Scanner(document);
scanner.useDelimiter("[^\\w']+");
String separator;
while (scanner.hasNext()){
    separator = scanner.findInLine(Pattern.compile(".I \\d"));
    if (separator!= null) {
        System.out.println("Found: " + separator);
        scanner.nextLine();
        scanner.nextLine();
    }
    list.add(scanner.next());
}
scanner.close();

如果可能的话,我还希望能够获取实际的文章编号,即附加到每个分隔符上的编号。

我的代码有什么问题?

【问题讨论】:

    标签: java regex parsing java.util.scanner


    【解决方案1】:

    问题在于,由于您告诉Scanner 使用除单词字符和刻度之外的所有内容作为分隔符,I 前面的点会被scanner.next() 消耗,每次它即将出现在您的@ 987654325@搜索。

    您可以通过逐行读取输入而不是逐字读取来解决此问题,如下所示:

    list.add(scanner.nextLine());
    

    要获取文章编号,请从字符 3 开始解析分隔符:

    int num = Integer.valueOf(separator.substring(3));
    

    这是一个从标准输入读取的演示:

    Scanner scanner = new Scanner(System.in);
    scanner.useDelimiter("[^\\w']+");
    String separator;
    Pattern rx = Pattern.compile(".I \\d");
    while (scanner.hasNext()){
        separator = scanner.findInLine(rx);
        if (separator!= null) {
            int num = Integer.valueOf(separator.substring(3));
            System.out.println("Found: " + separator+", article number: "+num);
            scanner.nextLine();
            scanner.nextLine();
        }
        System.out.println(scanner.nextLine());
    }
    scanner.close();
    

    Demo.

    【讨论】:

    • 谢谢。我最终使用了这个变体,不使用带有扫描仪的分隔符。完成每一行后,我使用 String.split 和原始分隔符正则表达式来获取每个单词。
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多