string.length()的奇怪行为

hrysbysz  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(321)

我有主修课:

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-是列表中第一个字符串的长度。
所以问题是为什么它还要多算一个符号?
vsaztqbk

vsaztqbk1#

使用正则表达式很难捕捉西里尔字符,例如 \p{Graph} 不起作用,尽管它们是清晰可见的字符。不管怎么说,这不是问题。
实际问题可能是由于存在其他不可见字符,也可能是控制字符。尝试以下正则表达式以删除更多: replaceAll("(\\s|\\p{Cntrl})+","") . 您可以使用regex进一步扩展到其他情况。

m1m5dgzv

m1m5dgzv2#

谢谢大家。
上面说的这个符号@bill就是bom(http://en.wikipedia.org/wiki/byte_order_mark)并位于文本文件的开头。所以我在这条线上找到了这个符号:

System.out.println(((int)firstLastWords.get(0).charAt(0)));

它给了我65279
然后我就改了这句话: String line1 = line.replaceAll("\\s+",""); 为了这个

String line1 = line.replaceAll("\uFEFF","");

相关问题