需求是統計工程裏所有中文字符(中文註釋除外),並且整理到word文檔中。例如,工程裏一個帶有中文字符的文件如下:
統計結果:
如果中文字符串數量很少,我們完全可以手動一個一個統計,但如果數量很多,幾百幾千個中文字符,在一個一個手動統計怕是要累死人。而用正則表達式就可以輕鬆地完成統計。
首先我們用正則表達式匹配文件裏(java)所有帶有雙引號的中文字符。剛開始我用的表達式是:"[\u4e00-\u9fa5]+"
結果發現只能匹配引號中是純中文的字符串,像"您輸入的暱稱長度不正確,請重新輸入","暱稱中不可有空格,請重新輸入!","暱稱中包含敏感字符,請重新輸入【",這些都無法匹配到。正確的表達式應該是:"(?:[^"\\]|\\.)*"
這樣就能匹配所有帶有雙引號的字符了。
不難看出,如果匹配所有純中文字符(不帶引號),那應該用的正則表達式是:[\u4e00-\u9fa5]
這樣是一個漢字一個漢字地匹配的。當然,這裏前後的雙引號也可以換成其他符號,比如換成單引號就是匹配帶有單引號(被單引號包括)的字符,換成小括號就是匹配帶有小括號(被小括號包括)的字符……
總結一下就是:
匹配所有雙引號內的純中文字符:"[\u4e00-\u9fa5]+"
匹配所有雙引號內的字符:"(?:[^"\\]|\\.)*"
匹配成功後,我們可以通過整體替換,提取出來所有匹配的字符。比如我們這個,我們先把要統計的文檔粘貼到notepad++裏(其他編輯工具也可以),由於我們要獲取引號內的字符,那我們只需要把引號外的內容刪除掉,剩下的就是我們想要的。但是問題是我們怎麼才能刪掉引號外的內容呢?其實上面我們已經找到了方法,還是用正則表達式,我們在文本的開頭加上一個引號,如下圖所示:
然後,我們從文檔最開始搜索替換,輸入我們前面的匹配帶有雙引號的字符的正則表達式:
切記光標一定要放在文檔最前頭,也就是我們加的那個引號之前,否則匹配會混亂。如果不確定可以先點擊“查找下一個”看看匹配是否正確,確定無誤後,點擊全部替換,結果如下:
最後我們只需要把文本最前面的一個引號和逗號去掉,再在文本最後加上一個引號,就得到要求的統計結果了。
如果有更好的方法,希望不吝賜教!