我有一个文本文件,其中包含我需要解析的一些文章。
我需要检索每篇文章中的每个单词,不包括任何句号,逗号等。文章由特定的两行分隔,我正在尝试使用正则表达式模式来查找这些点。
该文件的一个例子如下:
.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();
如果可能,我还希望能够获取实际的商品编号,即每个分隔符附加的编号。
我的代码出了什么问题?
答案 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();