簡體   English   中英

String.length()的奇怪行為

[英]Strange behaviour of String.length()

我有主課:

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();
    }
}
}

我有FileParser:

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 - 是列表中第一個字符串的長度。

所以問題是為什么它又算一個符號呢?

謝謝大家。

這個符號表示@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","");

使用正則表達式很難捕獲西里爾字符,例如\\p{Graph}不起作用,盡管它們是清晰可見的字符。 無論如何,這是OP問題之外的問題。

實際問題可能是由於其他不可見的字符,可能存在控制字符。 嘗試使用以下正則表達式刪除更多: replaceAll("(\\\\s|\\\\p{Cntrl})+","") 您可以使用正則表達式進一步擴展到其他情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM