我正在尝试在java中读取文本文件(.txt)。我需要最终将文本逐字逐句地提取到二叉树的节点中。例如,如果我有文字:“嗨,我正在做测试!”,我想把它分成“嗨”“我”“m”“做”“一个”“测试”,基本上都是跳过所有标点符号和空格,并将一个单词视为一系列连续的字母。我到目前为止能够提取单词并将它们放入数组中进行测试。但是,如果我的.txt文件中有一个完全空行,代码会将其视为一个单词并返回一个空格。此外,行尾的标点符号有效,但如果有一个逗号例如然后是文本,我也会得到一个空白空间!这是我到目前为止所尝试的:
public static void main(String[] args) throws Exception
{
FileReader file = new FileReader("File.txt");
BufferedReader reader = new BufferedReader(file);
String text = "";
String line = reader.readLine();
while (line != null)
{
text += line;
line = reader.readLine();
}
System.out.println(text);
String textnospaces=text.replaceAll("\\s+", " ");
System.out.println(textnospaces);
String [] tokens = textnospaces.split("[\\W+]");
for(int i=0;i<=tokens.length-1;i++)
{
tokens[i]=tokens[i].toLowerCase();
System.out.println(tokens[i]);
}
}
使用以下文字:
我不能,来看你。今天我的朋友很难
取值
我得到以下输出:
我
可以
吨 (“t”和“come”之间的额外空间)
来
见
您 (再次增加空间)
今天
我
朋友
是
顽固派
任何帮助将不胜感激!谢谢
答案 0 :(得分:0)
使用String的trim()
方法。来自文档http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim%28%29:
“返回字符串的副本,省略前导和尾随空格。
如果此String对象表示空字符序列,或者此String对象表示的字符序列的第一个和最后一个字符的代码都大于'\ u0020'(空格字符),则对此String对象的引用为返回。
否则,如果字符串中没有代码大于'\ u0020'的字符,则会创建并返回表示空字符串的新String对象。
否则,令k为代码大于'\ u0020'的字符串中第一个字符的索引,并且令m为代码大于'\ u0020'的字符串中最后一个字符的索引。创建一个新的String对象,表示该字符串的子字符串,该字符串以索引k处的字符开头,以索引m处的字符结尾,即this.substring(k,m + 1)的结果。
此方法可用于从字符串的开头和结尾修剪空格(如上所述)。
返回: 删除了前导和尾随空格的此字符串的副本,如果没有前导或尾随空格,则为此字符串。“
答案 1 :(得分:0)
如果你真的只是寻找每个连续的字符序列,你可以通过非常简单的正则表达式匹配来实现这一点。
String patternString1 = "([a-zA-Z]+)";
String text = "I can't, come see you. Today my friend is hard";
Pattern pattern = Pattern.compile(patternString1);
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
System.out.println("found: " + matcher.group(1));
}