JS:去掉Java代碼中的注釋(也適用於JS和C#)

來源:互聯網
上載者:User
用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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.