Java String.length()的奇怪行为
我有一门主修课:Java String.length()的奇怪行为,java,string,string-length,Java,String,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
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();
}
}
}
程序返回:
[тор, кит]
4
[т, тор, кит]
2
如果文件包含:
тор
кит
т
тор
кит
程序返回:
[тор, кит]
4
[т, тор, кит]
2
即使文件包含:
//跳转到下一行
цц
ццц
程序返回:
[, тор, кит]
1
其中数字-是列表中第一个字符串的长度
因此,问题是为什么它还要计算一个符号?西里尔字母很难用正则表达式捕获,例如
\p{Graph}
不起作用,尽管它们是清晰可见的字符。不管怎么说,这不是OP的问题
实际问题可能是由于存在其他不可见字符,可能是控制字符。尝试使用以下正则表达式删除更多内容:replaceAll(“(\\s |\\p{Cntrl})+”,”)
。您可以使用正则表达式进一步扩展到其他情况 谢谢大家
该符号如@Bill所述为BOM(),位于文本文件的开头。
所以我在这行找到了这个符号:System.out.println(((int)firstLastWords.get(0).charAt(0)));
它给了我65279
然后我就改了这行:String line1=line.replaceAll(“\\s+”,”)代码>
对此
String line1 = line.replaceAll("\uFEFF","");
从字符串#length的文档中—“返回此字符串的长度。长度等于字符串中Unicode代码单元的数量。”这如何解释OP的问题?我不理解在这个问题上的反对票-这家伙正确地包括了所有相关的代码,描述了发生了什么,并描述了他期望的内容。这几乎是一个正确的代码问题的后续问题。我每天都会看到几十个可怕的代码问题,没有得到任何反对票。请解释你自己,选民们。你的档案里可能有某种无法打印的字符。你能试着检查一下字符串中的每个字符并单独打印出来吗?@erwinbolwidt-我完全同意;我真的投了赞成票,你能试试这个:replaceAll(“(\\s|\\p{Cntrl}\\n|\\r)+”,“你能告诉我结果吗?”)
-并告诉我结果。试着把这个代码放在(字节b:line1.getBytes()){System.out.print((长)b)&0xFF);System.out.print(“/”)System.out.print(}System.out.println()代码>以确定隐藏的字符是什么。