1. 程式人生 > >String tirm()方法去不掉的空格

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

移除空白行:使用正則表示式

使用String類的replaceAll()方法可以移除空白行,只要我用正則表示式匹配到這些空白行,然後把這些空白行替換為空字串就行了。

text = text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");

(?m)表示開啟多行匹配模式,^匹配行開頭,\\s*0個或多個空白符,$匹配行結尾,(\\n|\\r\\n)匹配字串中的換行符。

測試程式碼如下:

String text = SysClipboardUtil.getSysClipboardText();
System.out.println("去除無意義空白行後:");
text = text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
System.out.println(text);
去除無意義空白行後:
  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(); ____________________________________

好的,第一個需求做到了。

移除每行前面的多餘空白符

String.trim()方法刪除不掉該空格符

現在text字串中,每一行的前面有兩個空白符:,因為這些空白符在行尾,很自然想到使用text.trim()方法取出掉該空白符,但是奇怪的是根本就去不掉。
之所以去不掉是因為這個空格不簡單啊,不是普通那種空格,這裡稱為bug空格
bug空格:

普通空格:

可以看到這個bug空格比普通的空格的寬度要寬。不過也不是沒有辦法。

思路1:用該空格自己匹配來自己,進行替換刪除

不過既然這個bug空格可以複製貼上,那我就直接貼上到程式中,用它自己來匹配自己,這樣使用text.replaceAll("[ ]+","")就可以把這個bug空格" "全部替換成空白字串"",就相當於刪除掉該字串了。
程式碼如下:

String text = SysClipboardUtil.getSysClipboardText();
//刪除文字中的空白行
text=text.replaceAll("(?m)^\\s*$(\\n|\\r\\n)", "");
System.out.println("刪除空白行之後的文字:");
System.out.println(text);
//直接貼上這個空格到字元組中,
text=text.replaceAll("[ ]+", "");
System.out.println("_______________________________");
System.out.println("去除中文全形空格後:");
System.out.println(text);

複製需要處理的文字,然後執行上面的程式碼。執行結果如下。

刪除空白行之後的文字:
  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();

可以看到用了這種傻瓜式的操作就可以完成任務了。不過還是有點心有不甘,因為不知道這個bug空格是什麼東西,下面來看看這個bug空格到底是什麼東西。

思路2:轉成Unicode碼然後查碼錶看看是什麼東西

查了一下,其實這個空格叫做中文(全形)空格,我怎麼知道的呢。先把這個空格轉換成Unicode字元就知道了。
程式碼如下

String chinese_full_width_space=" ";//中文全形空格
String urlEncoderUnicode = URLEncoder.encode(chinese_full_width_space,"utf-16be");//java中的字元都用utf-16be進行編碼,所以轉碼為utf-16be我們就知道了這個奇怪的字元在java裡的編碼。這樣方便後面查詢。
System.out.println(urlEncoderUnicode);

執行結果:

%30%00

%30%00轉換成平常表示的java中的Unicode編碼就是\u3000,然後再到網上查一下看看這個\u3000是什麼:

嗯,原來這個bug空格叫做中文全形空格

好的,既然我們知道了這個奇怪的空格是中文全形空格,也知道對應的Unicode碼為\u3000,java中正則表示式支援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);

執行結果:

刪除空白行之後的文字:
  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();

啟發

遇到一個不懂的字元的時候可以先把它轉為Unicode碼,然再查碼錶,或者網上查。

相關推薦

no