用JS寫的,用網頁作為載體。歡迎有心人測試一下。因為沒有學過演算法,憑自己想象去寫,也不知道好不好,湊合用吧。談一下自己的理解。單行注釋://... 或 /*...*/多行注釋:/*... ... */如果這些字元在字串裡面,就不是注釋了;如果字串在注釋裡面,就不是字串了;還有js的Regex的特殊文法的搗亂;還有逸出字元/(反斜線)的搞鬼;所以,挺麻煩的。反正是寫完了,注釋也寫了不少,怕自己忘了,用了下還算比較好使,就這樣吧。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> Delete comment </TITLE><META NAME="Author" CONTENT="zc-peng"></HEAD><BODY><textarea style="height:300;width:500" name="t1" onpropertychange="deleteComment()"></textarea><textarea style="height:300;width:500" name="t2"></textarea></BODY><script>
function deleteComment(){ var t1_Content = document.all.t1.value; //輸出變數 var result = ""; //全域標誌,用於處理多行注釋 var flag = false; //按行劈開,b是字串數組 var b = t1_Content.split("/r/n"); //for per row //對於每一行 for(var i = 0;i<b.length;i++){ var perRow = b[i];//當前行的字串 //如果是多行注釋 if(flag == true){ //判斷是否存在多行注釋的結束符 if(perRow.indexOf("*/") != -1){ //exist "*/" //delete comment //取*/後面的字元 perRow = perRow.substr(perRow.indexOf("*/") + 2); //把多行注釋標誌複位,下次用 flag = false; //流程繼續往下走,因為這一行剩下的字串可能還有注釋 }else{ //不存在,表明當前行仍然是多行注釋的一部分,繼續檢查下一行 //而且不把此行累加到輸出變數中 continue;//流程不往下走 } } //對於每一行,判斷是否存在雙引號"或者注釋起始符/ if(perRow.indexOf("/"") == -1 && perRow.indexOf("/") == -1){ //neither " nor / exsit in perRow //do nothing //兩者都不存在,什麼也不用做,檢查下一行 }else if(perRow.indexOf("/"") != -1 && perRow.indexOf("/") == -1){ //only " exist in perRow //do nothing //只存在雙引號,也是什麼都不用做,檢查下一行 //以上兩個判斷可以簡化成一個 }else{ //如果存在"或者/,或者兩者都存在 //在每一行中,對每一個字元進行判斷 //for per character for(var j = 0;j<perRow.length;j++){ //取出每一個字元 var tempChar = perRow.substr(j,1);//per char //如果是"的話,必須進行下一個"的匹配 if(tempChar == "/""){ //算出下一個字元的位置(index) var tempCol = j+1; if(tempCol == perRow.length){ //如果沒有下一個字元,則檢查下一行 //覺得不要這個判斷也可以,因為需要處理的代碼都是編譯正確的代碼, //不會出現這種情況的 //結束當前行處理,進行結果累加 break;//next row }else{ //如果有下一個字元,迴圈判斷 for(var k = tempCol;k<perRow.length;k++){ //取出下一個字元 var nextChar = perRow.substr(k,1); //如果是"的話,還得判斷它的前一個字元是否是逸出字元/ if(nextChar == "/""){ //取出它的前一個字元 var temp = perRow.substr(k-1,1); //如果是逸出字元的話 if(temp == "//"){ //繼續檢查下一個字元 continue; }else{ //match "..." //如果不是/,則匹配上一對" j = k; //跳出字串雙引號的匹配迴圈,進行下一個字元的檢查 break;//next col } } } } }else if(tempChar == "/"){ //如果是注釋起始符的話, //算出下一個字元的位置 var tempCol = j+1; if(tempCol == perRow.length){ //如果沒有下一個字元,則結束當前行處理,進行結果累加 break;//next row }else{ //如果下一個字元是/的話,還得判斷前面那個字元是不是轉移字元, //這樣做的目的是避免js中的Regex if(perRow.substr(tempCol,1) == "/"){ //判斷是不是第一個字元 if(j != 0){ //不是第一個的話,看它前面的字元是否是/ if(perRow.substr(j - 1,1) == "//"){ //regExp //like : ///*asdf*/// //如果是的話,則表明這是一個Regex,不是注釋, //則對此行的下一個字元進行檢查 continue; } } //如果當前字元是/,它的下一個字元也是/,它的前一個字元不是/,則表明這是一個單行注釋 //則取這個字元的前面的字串作為刪掉注釋後的結果,累加到輸出變數 //delete comment perRow = perRow.substr(0,j); //跳出,結束當前行處理,進行結果累加 break;//next row }else if(perRow.substr(tempCol,1) == "*"){ //也是為了避免js的Regex if(j != 0){ if(perRow.substr(j - 1,1) == "//"){ //regExp //like : ///*asdf*/// continue; } } //如果當前字元是/,它的下一個字元是*,它的前一個字元不是/,則表明這是一個/*形式的注釋 //把多行注釋標誌置成true flag = true; //把此行剩下的字串取出 var temp = perRow.substr(j + 2); //看看剩下的字串裡面有沒有*/ if(temp.indexOf("*/") != -1){ //delete comment //如果有的話,則把/*...*/這樣的注釋刪掉 perRow = perRow.substr(0,j) + temp.substr(temp.indexOf("*/") + 2); //把標誌複位,表明刪除完畢 flag = false; //因為刪掉注釋以後,j已經指向下一個字元,而這個邏輯處理完畢之後, //會執行for(每一行)的迴圈的j++,這樣就會跳過一個字元, //所以需要先j-- j--;//important }else{ //delete comment //如果在此行剩下的字串沒有發現*/,則表明這是一個多行注釋 //刪掉剩下的字串(取出前面的字串作為結果) perRow = perRow.substr(0,j); //結束當前行處理,結果累加 break;//next row } }else{ //下一個字元既不是/也不是*, //那麼,這不是一個注釋起始符,進行下一個字元的檢查 continue; } } } } } //進行下一行之前,把結果累加到輸出變數 result += perRow + "/r/n"; } document.all.t2.value = result;}</script></HTML>