我有主修课:
public class Main {
// args[0] - is path to file with first and last words
// args[1] - is path to file with dictionary
public static void main(String[] args) {
try {
List<String> firstLastWords = FileParser.getWords(args[0]);
System.out.println(firstLastWords);
System.out.println(firstLastWords.get(0).length());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
我有文件解析器:
public class FileParser {
public FileParser() {
}
final static Charset ENCODING = StandardCharsets.UTF_8;
public static List<String> getWords(String filePath) throws IOException {
List<String> list = new ArrayList<String>();
Path path = Paths.get(filePath);
try (BufferedReader reader = Files.newBufferedReader(path, ENCODING)) {
String line = null;
while ((line = reader.readLine()) != null) {
String line1 = line.replaceAll("\\s+","");
if (!line1.equals("") && !line1.equals(" ") ){
list.add(line1);
}
}
reader.close();
}
return list;
}
}
``` `args[0]` 只有2个字的txt文件路径。如果文件包含:
тор
кит
程序返回:
[тор, кит]
4
如果文件包含:
т
тор
кит
程序返回:
[т, тор, кит]
2
即使文件包含:
//跳到下一行
тор
кит
程序返回:
[, тор, кит]
1
其中digit-是列表中第一个字符串的长度。
所以问题是为什么它还要多算一个符号?
2条答案
按热度按时间vsaztqbk1#
使用正则表达式很难捕捉西里尔字符,例如
\p{Graph}
不起作用,尽管它们是清晰可见的字符。不管怎么说,这不是问题。实际问题可能是由于存在其他不可见字符,也可能是控制字符。尝试以下正则表达式以删除更多:
replaceAll("(\\s|\\p{Cntrl})+","")
. 您可以使用regex进一步扩展到其他情况。m1m5dgzv2#
谢谢大家。
上面说的这个符号@bill就是bom(http://en.wikipedia.org/wiki/byte_order_mark)并位于文本文件的开头。所以我在这条线上找到了这个符号:
它给了我65279
然后我就改了这句话:
String line1 = line.replaceAll("\\s+","");
为了这个