天天看點

批量字元串替換

場景:上一篇批量修改檔案名中提到表情庫的修改,它修改成功了,順序也有了,但是每個表情對應着一個文字描述,例如:[微笑],是以想用别人的表情庫,也就得用别人的文字描述,主要是順序和對應(主要是懶,雖然拿來主義也并不是不需要改動,但程式員嘛,有規律可循的事情還是交給代碼去執行吧),言歸正傳,别人的文字描述是這樣的:

mFaceMap.put("[調皮]", R.drawable.f001);
mFaceMap.put("[流汗]", R.drawable.f002);
mFaceMap.put("[偷笑]", R.drawable.f003);
mFaceMap.put("[再見]", R.drawable.f004);
mFaceMap.put("[敲打]", R.drawable.f005);
……
           

自己想要的是這樣的:

public static String[] emoticonData = {
            "[驚訝]","[撇嘴]","[色]","[發呆]","[得意]","[流淚]","[害羞]",
            "[閉嘴]","[睡]","[大哭]","[尴尬]","[發怒]","[調皮]","[龇牙]",
            "[微笑]","[難過]","[酷]","[冷汗]","[抓狂]","[吐]","[偷笑]",
            "[可愛]","[白眼]","[傲慢]","[餓]","[困]","[驚恐]","[流汗]",
            "[憨笑]","[大兵]","[奮鬥]","[咒罵]","[疑問]","[噓]","[暈]",
            }
           

爬坑進行時:第一個想法,電腦都有文本編輯器,之前有個什麼軟體可以支援豎向編輯的,但是換電腦、軟體版權之類的原因,現在電腦上隻有個notepad++,ok,也能用吧,複制粘貼,然後查找替換,然後遇到問題了,後邊的那串001、002之類的并不相同,怎麼辦呢,偶然看到替換的地方有個選項是正規表達式,額,不會啊(能力到用時方很少啊),怎麼辦,不會這個,總得會另一個吧,問題總是能解決的。第二個想法出來了,這個不是字元串提取嘛,自己隻是想要 [ ] 的資料,so,

public static void main(String[] args) {
		String str = "mFaceMap.put("[呲牙]", R.drawable.f000);
		mFaceMap.put("[調皮]", R.drawable.f001);
		mFaceMap.put("[流汗]", R.drawable.f002);
		mFaceMap.put("[偷笑]", R.drawable.f003);
		mFaceMap.put("[再見]", R.drawable.f004);
		mFaceMap.put("[敲打]", R.drawable.f005);
		mFaceMap.put("[擦汗]", R.drawable.f006);
		mFaceMap.put("[豬頭]", R.drawable.f007);
		……
		}
           

如果照着這個做了,會發現,在java檔案中,這個字元串是報錯的,原因嘛,雙引号中總不能還有雙引号吧,轉義字元?OK,那總不能一個個再去修改下吧,那工作量,不是我想要的,(其實,最後搞完,想起來好像有種方法可以解決這個雙引号的問題,有知道的不妨抛出來)。那怎麼辦呢?不能直接定義,那就從檔案裡邊讀取吧,也是一樣的,so,

public static void main(String[] args) {
		// TODO Auto-generated method stub
		// String str = "";
		try { // 防止檔案建立或讀取失敗,用catch捕捉錯誤并列印,也可以throw

			/* 讀入TXT檔案 */
			String pathname = "D:/ReNameFile.java"; // 絕對路徑或相對路徑都可以,這裡是絕對路徑,寫入檔案時示範相對路徑
			File filename = new File(pathname); // 要讀取以上路徑的input。txt檔案
			InputStreamReader reader = new InputStreamReader(
					new FileInputStream(filename),"utf-8"); // 建立一個輸入流對象reader
			BufferedReader br = new BufferedReader(reader); // 建立一個對象,它把檔案内容轉成計算機能讀懂的語言
			String line = "";
			StringBuilder stringBuilder = new StringBuilder();
			line = br.readLine();
			System.out.println("line="+line);
			int i = 0;
			while (line != null) {
				i++;
				System.out.println("循環:"+i);
				if(line.contains("[")){
					String str = line.substring(line.indexOf("["),line.indexOf("]")+1);
					System.out.println("str="+str);
					stringBuilder.append("\""+str+"\"").append(",");
				}
				line = br.readLine(); // 一次讀入一行資料
			}
			System.out.println("#"+stringBuilder.toString());
			
			/* 寫入Txt檔案 */
			// File writename = new File(".\\result\\en\\output.txt"); //
			// 相對路徑,如果沒有則要建立一個新的output。txt檔案
			// writename.createNewFile(); // 建立新檔案
			// BufferedWriter out = new BufferedWriter(new
			// FileWriter(writename));
			// out.write("我會寫入檔案啦\r\n"); // \r\n即為換行
			// out.flush(); // 把緩存區内容壓入檔案
			// out.close(); // 最後記得關閉檔案

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
           

ok,執行,console中可以看到,循環次數和表情庫檔案數一緻,資料完整,結果:"[呲牙]","[調皮]","[流汗]","[偷笑]","[再見]","[敲打]","[擦汗]","[豬頭]","[玫瑰]","[流淚]","[大哭]","[噓]","[酷]","[抓狂]","[委屈]","[便便]","[炸彈]","[菜刀]","[可愛]","[色]","[害羞]","[得意]","[吐]","[微笑]","[發怒]","[尴尬]","[驚恐]","[冷汗]","[愛心]","[示愛]","[白眼]","[傲慢]","[難過]","[驚訝]","[疑問]","[睡]","[親親]","[憨笑]","[愛情]","[衰]","[撇嘴]","[陰險]","[奮鬥]","[發呆]","[右哼哼]","[擁抱]","[壞笑]","[飛吻]","[鄙視]","[暈]","[大兵]","[可憐]","[強]","[弱]","[握手]","[勝利]","[抱拳]","[凋謝]","[飯]","[蛋糕]","[西瓜]","[啤酒]","[飄蟲]","[勾引]","[OK]","[愛你]","[咖啡]","[錢]","[月亮]","[美女]","[刀]","[發抖]","[差勁]","[拳頭]","[心碎]","[太陽]","[禮物]","[足球]","[骷髅]","[揮手]","[閃電]","[饑餓]","[困]","[咒罵]","[折磨]","[摳鼻]","[鼓掌]","[糗大了]","[左哼哼]","[哈欠]","[快哭了]","[吓]","[籃球]","[乒乓球]","[NO]","[跳跳]","[怄火]","[轉圈]","[磕頭]","[回頭]","[跳繩]","[激動]","[街舞]","[獻吻]","[左太極]","[右太極]","[閉嘴]",

放到自己需要的地方。(這裡程式是一下都看到了,過程當中,修修改改的,看自己需要了,後邊的寫入檔案也不需要了,我隻要結果,從哪兒拿到都行,console中也可以啦)。