扫描仪中的正则表达式只能找到第一个匹配项

时间:2014-10-20 17:55:36

标签: java regex parsing java.util.scanner

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

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

该文件的一个例子如下:

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

如果可能,我还希望能够获取实际的商品编号,即每个分隔符附加的编号。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

问题在于,由于您告诉Scanner使用除字词和刻度之外的所有内容作为分隔符,I前面的点每次都被scanner.next()占用进入findInLine搜索。

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

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.