Java 扫描程序中的正则表达式只找到第一个匹配项

Java 扫描程序中的正则表达式只找到第一个匹配项,java,regex,parsing,java.util.scanner,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,并添加了所有后续单词,但一

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

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

该文件的示例如下:

.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();
如果可能的话,我也希望能够抓取实际的文章编号,这是附加到每个分隔符的编号


我的代码出了什么问题?

问题是,既然你告诉
扫描器
使用除单词字符和记号之外的所有字符作为分隔符,那么
I
前面的点就会被
扫描器所使用。next()
每次在
查找行
搜索中出现时,它都会被消耗掉

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

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

谢谢。我最终使用了一种变体,即在扫描仪中不使用分隔符。一旦我有了每一行,我就使用String.split和原始的分隔符regex来获得每个单词。