String tirm()方法去不掉的空格
刪除String trim()方法去不掉的空格(中文(全角)空格)
需求
- 移除掉下面代碼中的空白行。
- 移除每行前面的多余空白符
要處理的文本:
BufferedReader in;Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");in = new BufferedReader(new FileReader("phone"));String s;while ((s = in.readLine()) != null){Matcher matcher = pattern.matcher(s);if (matcher.find()){System.out.println(matcher.group());}}in.close();移除空白行:使用正則表達(dá)式
使用String類的replaceAll()方法可以移除空白行,只要我用正則表達(dá)式匹配到這些空白行,然后把這些空白行替換為空字符串就行了。
text = text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");(?m)表示開啟多行匹配模式,^匹配行開頭,\\s*0個或多個空白符,$匹配行結(jié)尾,(\\n|\\r\\n)匹配字符串中的換行符。
測試代碼如下:
String text = SysClipboardUtil.getSysClipboardText(); System.out.println("去除無意義空白行后:"); text = text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", ""); System.out.println(text);依賴:SysClipboardUtil.getSysClipboardText();
運行結(jié)果:
好的,第一個需求做到了。
移除每行前面的多余空白符
String.trim()方法刪除不掉該空格符
現(xiàn)在text字符串中,每一行的前面有兩個空白符: ,因為這些空白符在行尾,很自然想到使用text.trim()方法取出掉該空白符,但是奇怪的是根本就去不掉。
之所以去不掉是因為這個空格不簡單啊,不是普通那種空格,這里稱為bug空格。
bug空格:
普通空格:
、
可以看到這個bug空格比普通的空格的寬度要寬。不過也不是沒有辦法。
思路1:用該空格自己匹配來自己,進(jìn)行替換刪除
不過既然這個bug空格可以復(fù)制粘貼,那我就直接粘貼到程序中,用它自己來匹配自己,這樣使用text.replaceAll("[ ]+","")就可以把這個bug空格" "全部替換成空白字符串"",就相當(dāng)于刪除掉該字符串了。
代碼如下:
復(fù)制需要處理的文本,然后運行上面的代碼。運行結(jié)果如下。
刪除空白行之后的文本:BufferedReader in;Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");in = new BufferedReader(new FileReader("phone"));String s;while ((s = in.readLine()) != null){Matcher matcher = pattern.matcher(s);if (matcher.find()){System.out.println(matcher.group());}}in.close(); _______________________________ 去除中文全角空格后: BufferedReader in; Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}"); in = new BufferedReader(new FileReader("phone")); String s; while ((s = in.readLine()) != null) { Matcher matcher = pattern.matcher(s); if (matcher.find()) { System.out.println(matcher.group()); } } in.close();可以看到用了這種傻瓜式的操作就可以完成任務(wù)了。不過還是有點心有不甘,因為不知道這個bug空格是什么東西,下面來看看這個bug空格到底是什么東西。
思路2:轉(zhuǎn)成Unicode碼然后查碼表看看是什么東西
查了一下,其實這個空格叫做中文(全角)空格,我怎么知道的呢。先把這個空格轉(zhuǎn)換成Unicode字符就知道了。
代碼如下
運行結(jié)果:
%30%00%30%00轉(zhuǎn)換成平常表示的java中的Unicode編碼就是\u3000,然后再到網(wǎng)上查一下看看這個\u3000是什么:
嗯,原來這個bug空格叫做中文全角空格
好的,既然我們知道了這個奇怪的空格是中文全角空格,也知道對應(yīng)的Unicode碼為\u3000,java中正則表達(dá)式支持Unicode碼,所以可以使用text=text.replaceAll("\u3000+", "");把所以的中文全角空格替換成空字符,也就是移除掉所有的中文全角空格了。
String text = SysClipboardUtil.getSysClipboardText();//刪除文本中的空白行text=text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");System.out.println("刪除空白行之后的文本:");System.out.println(text);//直接粘貼這個空格到字符組中, // text=text.replaceAll("[ ]+", ""); // 使用Unicode碼匹配中文全角空格text=text.replaceAll("\u3000+", "");System.out.println("_______________________________");System.out.println("去除中文全角空格后:");System.out.println(text);運行結(jié)果:
刪除空白行之后的文本:BufferedReader in;Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}");in = new BufferedReader(new FileReader("phone"));String s;while ((s = in.readLine()) != null){Matcher matcher = pattern.matcher(s);if (matcher.find()){System.out.println(matcher.group());}}in.close(); _______________________________ 去除中文全角空格后: BufferedReader in; Pattern pattern = Pattern.compile("//(//d{3}//)//s//d{3}-//d{4}"); in = new BufferedReader(new FileReader("phone")); String s; while ((s = in.readLine()) != null) { Matcher matcher = pattern.matcher(s); if (matcher.find()) { System.out.println(matcher.group()); } } in.close();啟發(fā)
遇到一個不懂的字符的時候可以先把它轉(zhuǎn)為Unicode碼,然再查碼表,或者網(wǎng)上查。
總結(jié)
以上是生活随笔為你收集整理的String tirm()方法去不掉的空格的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽世界各服务器显示版本,魔兽7.1各服
- 下一篇: 使用Java完成Socket文件传输