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碼,然再查碼錶,或者網上查。

相關推薦

String tirm()方法空格

刪除String trim()方法去不掉的空格(中文(全形)空格) 需求 移除掉下面程式碼中的空白行。 移除每行前面的多餘空白符 要處理的文字:   BufferedReader in;   Pattern pattern = Patt

String】trim() 方法空格

1.問題由來      在對word/excel 做資料匯入匯出的時候,獲取excel 的numberic 的值 ,然後將該值轉為Integer 的時候 Integer.valueOf(value),總是報錯   for input String ...     debug

php空格的空白字元,trim,匹配也,怎麼辦

今天過濾一段文字,後面有2個空格,用trim去不掉,用preg_match也去不掉,去網上翻閱了無數的方法,終於找到了非常好的一個解決方法。該文章來源於https://my.oschina.net/fffddgx/blog/196376   ,思路是  ,首先將字元分隔開,

吐槽CSDN--想錢想瘋了--推薦文章裡面廣告博文

CSDN廣告手段高,廣告博文刪不掉! 如圖所示,我自己的部落格文章下面有個相關文章推薦,這是csdn新出的資訊流式內容呈現方式,也沒什麼太大問題。只是,你在裡面放廣告“羊毛衫,彈力褲”還夾著docker網路課程,我的天哪。docker那個還能接受,點選去是

myeclipse和eclipse一鍵取消所有斷點(取消的斷點)

找錯時我們經常打斷點,但斷點打多了一個一個取消很麻煩,也有時候eclipse出現錯誤導致斷點取消不了,所以我向大家分享一下心得,直接取消所有斷點,一下解決掉這些麻煩。 1.選擇window選單欄,選Pr

檔案刪除了,檔案粉碎也不行,只讀屬性,F8安全模式下也刪,引數正確

RT,本人各種情況都遇到過,試過網上的很多方法,自己也總結一下。 檔案刪除不了,檔案粉碎也不行,去不掉只讀屬性,DOS下也刪不掉,F8安全模式下也刪不掉 反正啥子招兒都試了,就是刪不掉,老頑固,格式化都不行,也沒有程式佔用這個資料夾,就是刪不掉。 分析: 1.通常刪不

String類的trim()方法能消除的空格

在後臺數據統計清洗中,我們時常會遇到針對字串的修改的問題,其中比較常見的就是消除字串中的空格。這裡筆者要闡述的不是如何消除字串中出現的空格,而是在消除字串中遇到的問題:有些空格不能使用trim()消除掉。 這個問題出現的原因在於trim()函式只能消除半形空格,而不能消除全

真正掌握vuex的使用方法(二)現在有的小夥伴是是在想,以後如果我要在這裏寫自己的計算屬性怎麽辦?怎麽辦?咱們可以通過對象合並的方法實現。 通過Object.assign()合並對象:

als js文件 false 目錄 pan md5加密 擴展 對象 pre 從上篇文章當中相信大家已經對vuex有了一些大概了解了,接下來咱們結合實例來繼續敲代碼吧!切記一定要動手實操練習一遍! 接下來咱們來完成一個超級簡單的投票功能!要求很簡單,點擊“投票”按鈕,相應的票

常用Java API 熟悉 方法 從記得到忘 java1.8.61為例

熟悉jDK自帶的常用API是十分有必要的 今天 2018/8/15 先來熟悉 最常用的 版本為 jdk 1.8.0_161 首先 明確一下 Java 到底是值傳遞還是引用傳遞? https://www.zhihu.com/question/31203609 也許這個知乎話題能夠解

Python字串方法 Python去除多餘空格

Python去除多餘空格   今天做爬蟲時。發現結果中好多多餘的空格。然後有強迫症的我當然不會放過   " xyz ".strip() # returns "xyz" " xyz ".lstrip(

通過js禁止輸入空格(試用場景:當用字符串拼接插入dom節點時,onkeyup這些方法好使可用這個)

urn lob ria 所有 span returns cas code else if <span style="font-family: Arial, Helvetica, sans-serif;"><input type="password" nam

新手做店鋪淘客模式會做,沒經驗?按照下面方法做,輕鬆開店

網店作為資訊時代的產物,發展到現在演變出了店鋪淘客,傳統淘客已經末路,店鋪淘客冉冉升起!開好一個淘客店鋪一定要有一個好的思路,一份堅持,加上百分之一百的努力。 淘寶客是始於2009年,通過淘寶聯盟平臺,從聯盟推廣專區獲取商品連結,任何買家通過您的推廣連結進入購買

string全形空格

#include "stdafx.h" #include <string> #include <iostream> #include <windows.h> usin

同一個dom上加單擊事件和雙擊事件的衝突解決辦法,雙擊事件方法

data() { return { TimeFn:''//定義公用變數}} $(".proManage fieldset ul li").dblclick(function(){//雙擊播放專案 //雙擊事件執行的方法   this.TimeFn = ""}) $(".proManage

無延時抖按鍵實現方法耗CPU)

這一靈感來源於定時器計數的方法,最後可以實現的效果跟咱們電腦鍵盤按鍵的效果一樣!我先來介紹下基本原理吧! 採用定時器中斷的方法,比如定時器終端我們設定為5ms,我們需要按鍵按下超過40ms時才算有按鍵按下,如果按鍵超過500ms時,我們就確定按鍵是連續按下的! 那麼我就需要

oracle 刪歸檔日誌檔案的解決方法

oracle 11g 舊的歸檔日誌無法清理 問題描述: 使用delete expired archivelog all; delete noprompt archivelog until time 'sysdate - 7' ;命令指令碼定時執行自動刪除7天以前的歸檔日誌,發現歸檔日誌資料夾還有大量磁碟空間未

controller.java方法

使用技術SSM,AngularJS問題描述啟動服務之後,開啟網頁的功能,在主頁面、controller.js、service.js都可以alert出,但是無法進入controller.java,debug也進不去controller.java中的方法,網頁F12報錯找不到pa

字串多個空格,以及字串特殊字元的方法

1.去空格以及多個空格public String trim() { String str = "小 米"; // 先去掉前後空格 str = str.trim(); // 去除空格前 System.out.println("pre:" + str);

印表機刪除的解決方法

在印表機故障的時候,有一種狀態是總有一個文件留在印表機裡刪除不掉,使印表機程式也刪除不掉,印表機也不能正常使用。 解決方法:1, 點選 "開始" 選單裡面的 "執行", 在 "開啟" 的命令列裡面輸入: net stop spooler. 2. 點選 "確定" 後, 會出現一

微信聊天記錄刪除可以恢復嗎?下面的方法試試

選擇 微信聊天 相對 ESS 會有 src 簡單 記得 提示 現在很多的使用手機的時候,都會選擇現在手機上下載一些社交軟件,這些社交軟件,對於我們來說有很多,像是微信、ins、QQ……許許多多的社交軟件,但是我們比較常用的還是微信,我們經常的在我們的微信去進行聊天,那麽我們