我写了一个程序,它必须从文件中获取输入并从中提取文本,同时将其内容保存到数组中。我的文本文件内容是:
There is some!text.written%in
the FILE[That]=Have+to`be==separated????
我试图编码的是:
public static void main(String[] args) throws FileNotFoundException, IOException {
BufferedReader file = new BufferedReader(new FileReader("mfile.txt"));
List<String> list = new ArrayList();
String str;
StringBuilder filedata = new StringBuilder();
Scanner toknizer = new Scanner(filedata.toString());
while((str=file.readLine())!=null){
filedata.append(str);
}
toknizer.useDelimiter("[^a-z]");
while(toknizer.hasNext()){
list.add(toknizer.next());
}
System.out.println(list);
}
此时我只想提取用小字母书写的文字。但该程序打印出一个空列表。调试显示toknizer.hasNext()
中while(toknizer.hasNext())
返回false。
怎么了?我使用错误的正则表达式吗?我想到了使用here中的[^a-z]
。
答案 0 :(得分:5)
Scanner toknizer = new Scanner(filedata.toString());
您刚刚在空字符串周围创建了Scanner
那不会有任何代币。
字符串是不可变的;稍后附加到StringBuilder
不会影响您传递给String
的现有Scanner
实例。
答案 1 :(得分:0)
为什么不这样做?
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public static void main(String[] args) {
List<String> list = new ArrayList<String>(); // If List is generic then ArrayList should be too
Scanner input = null;
try {
input = new Scanner(new File("mfile.txt"));
} catch(Exception e) {
System.out.println(e.getStackTrace());
}
input.useDelimiter("[^a-z]");
while(input.hasNext()) {
String parse = input.next();
if(!parse.equals("")) {
list.add(parse);
}
}
System.out.println(list.toString());
}
现在您不必使用BufferedReader
,FileReader
或StringBuilder
。