JAVA字符串中空格挖的坑
需求:
已知输入字符串str,如果str不存在或只有【空格、“无”、“空”】时即为空字符串。
解答过程:
1. 单纯的解答
直接用replace把空格、“空”、“无”替换掉,然后再判断字符串的长度是否为零,
1 public static boolean isBlank(String str) { 2 if (str == null) { 3 return true; 4 5 } 6 String newStr = str.replace(" ", "") 7 .replace("空", "") 8 .replace("无", ""); 9 return newStr.length() == 0 && !containsText(newStr); 10 } 11 12 private static boolean containsText(CharSequence str) { 13 int strLen = str.length(); 14 for (int i = 0; i < strLen; i++) { 15 if (!Character.isWhitespace(str.charAt(i))) { 16 return true; 17 } 18 } 19 return false; 20 }
原本以为这样就可以了,然后,然后,直到测试用例出现无论怎么输入,最后的字符串长度总是2,且是两个空格。
测试案例:
String str = "<p> </p>"; String str2 = "<p> </p>";
表面上看来这两个没什么问题,当我们把它们转化为ASCII码后再看
public String stringToAscii (String value) { StringBuilder sbu = new StringBuilder(); char[] chars = value.toCharArray(); for (int i = 0; i < chars.length; i++) { if(i != chars.length - 1) { sbu.append((int)chars[i]).append(","); } else { sbu.append((int)chars[i]); } } return sbu.toString(); }
结果:
没错,它俩其实完全不一样!
解决方案:
1 public static boolean isBlank(String str) { 2 if (str == null) { 3 return true; 4 5 } 6 String newStr = str.replace(" ", "") 7 .replace("空", "") 8 .replace("无", "") 9 .replaceAll("\\u00A0", ""); 10 return newStr.length() == 0 && containsText(newStr); 11 }
加个正则“
\\u00A0
”就可以替换掉ASCII码为160的空格了。