Javascript 无注释计数字符

Javascript 无注释计数字符,javascript,if-statement,while-loop,comments,Javascript,If Statement,While Loop,Comments,我试图创建一个函数,该函数可以计算字符串输入中的所有字符,但不计算任何注释(//或//*) 到目前为止,它可以完美地处理//之后的行。我将字符串按每一行拆分,如果不包括字符,我只计算行字符数// 这是迄今为止的代码: function findComments() { var string = document.getElementById("input").value; var splittedString = string.split("\n"); var cou

我试图创建一个函数,该函数可以计算字符串输入中的所有字符,但不计算任何注释(//或//*)

到目前为止,它可以完美地处理//之后的行。我将字符串按每一行拆分,如果不包括字符,我只计算行字符数//

这是迄今为止的代码:

function findComments() {

    var string = document.getElementById("input").value;
    var splittedString = string.split("\n");

    var count = 0;

    for (var i = 0; i < splittedString.length; i++) {
        while (countStars) {
            if(splittedString[i].indexOf("*/") > -1) {
                countStars = false;
            }
            continue;
        }

        if(splittedString[i].indexOf("/*") > -1) {
            var countStars = true;
        }

        if(splittedString[i].indexOf("//") === -1) {

            var chars = splittedString[i].split("");
            for (var j = 0; j < chars.length; j++) {
                count++;
            }
        }

    }
    console.log(count);
}
函数findComments(){
var string=document.getElementById(“输入”).value;
var splittedString=string.split(“\n”);
var计数=0;
对于(var i=0;i-1){
countStars=false;
}
继续;
}
if(拆分字符串[i].indexOf(“/*”>-1){
var countStars=真;
}
if(拆分字符串[i].indexOf(“/”)=-1){
var chars=splittedString[i]。拆分(“”);
对于(var j=0;j
正如我提到的,它应该继续循环,直到找到注释(*/)的结尾。到目前为止,这还不起作用

非常感谢您的帮助!:)

var inComment=false,count=0;
for(拆分字符串的常量行){
var-end=-1;
如果(不一致){
end=第行索引(“*/”);
如果(结束==-1){
计数+=行长度;
继续;
}否则{
计数+=结束;
不一致=错误;
}
}
const single=line.indexOf(“//”,end);
const multi=line.indexOf(“/*”,end);
如果(单+多==-2)继续;
如果(多!=-1&&multi<单){
//收到多行评论
不协调=正确;
计数+=行长度-(多个+2);
}否则{
//有一行评论
计数+=行长度-(单个+2);
}
}
如果您在多行注释中,只需保留一个标志

var inComment=false,count=0;
for(拆分字符串的常量行){
var-end=-1;
如果(不一致){
end=第行索引(“*/”);
如果(结束==-1){
计数+=行长度;
继续;
}否则{
计数+=结束;
不一致=错误;
}
}
const single=line.indexOf(“//”,end);
const multi=line.indexOf(“/*”,end);
如果(单+多==-2)继续;
如果(多!=-1&&multi<单){
//收到多行评论
不协调=正确;
计数+=行长度-(多个+2);
}否则{
//有一行评论
计数+=行长度-(单个+2);
}
}

如果您在多行注释中,只需保留一个标志,这可以进一步改进,但您可以将原始文本拆分为“/*”,并从计数中减去块注释的长度。这意味着不必要地计算块注释,但它完成了工作

像这样拆分文本,您知道数组中的每一个第二项都是您的块注释

var blockComments = string.split('/*');

function blockCommentsLength(array){
   length = 0;
   for (var i = 0; i < array.length; i = i +2){
      length += array[i].length
   }

   return length;
}

...

console.log(count - blockCommentsLength(blockComments));
var blockComments=string.split('/*');
功能块注释长度(数组){
长度=0;
对于(变量i=0;i
这可以进一步改进,但您可以将原始文本拆分为“/*”,并从计数中减去块注释的长度。这意味着不必要地计算块注释,但它完成了工作

像这样拆分文本,您知道数组中的每一个第二项都是您的块注释

var blockComments = string.split('/*');

function blockCommentsLength(array){
   length = 0;
   for (var i = 0; i < array.length; i = i +2){
      length += array[i].length
   }

   return length;
}

...

console.log(count - blockCommentsLength(blockComments));
var blockComments=string.split('/*');
功能块注释长度(数组){
长度=0;
对于(变量i=0;i
您应该在for循环之外声明countStars,因为您甚至在声明之前就在检查该变量
您应该从while循环中获取continue语句。“继续”将再次命中while语句。

for(var i = 0; i<10; ++i)
{
    var j = 10;
    var k = true;
    while(j > 0 && k)
    {
       j--;
       if(j == 8)
       {k == false;}
    }
    if(!k)
       continue;
}
for(变量i=0;i 0&&k)
{
j--;
如果(j==8)
{k==false;}
}
如果(!k)
继续;
}

您应该在for循环之外声明countStars,因为您甚至在声明之前就在检查该变量
您应该从while循环中获取continue语句。“继续”将再次命中while语句。

for(var i = 0; i<10; ++i)
{
    var j = 10;
    var k = true;
    while(j > 0 && k)
    {
       j--;
       if(j == 8)
       {k == false;}
    }
    if(!k)
       continue;
}
for(变量i=0;i 0&&k)
{
j--;
如果(j==8)
{k==false;}
}
如果(!k)
继续;
}


您可以忽略//之后的所有内容,但您需要处理//**/的多行内容-您可以使用
代码段编辑器创建一个吗?是的,很难处理多行内容,因为我需要以某种方式继续循环,直到找到一个*/只需在拆分为行之前删除它们即可。我想在没有正则表达式的情况下执行此操作,有没有办法在没有正则表达式的情况下删除它?您可以忽略//之后的所有内容,但您需要为/**/处理多行-您可以使用
代码段编辑器创建一个代码段吗?是的,很难处理多行,因为我需要以某种方式继续循环,直到找到一个*/只需在你分成几行之前删除它们。我想做它没有正则表达式,有没有办法删除它没有?很好的解决方案!有一个问题是,当我在/*…的内部创建新行时,它似乎不算数*/此外,你能详细说明for循环(const line of splittedStrings)的作用吗?@gustav实际上它应该可以工作。for循环正是for(var i=0…
loopnice解决方案的漂亮形式!一个问题是,当我在/*..*/中创建新行时,它似乎不起作用。此外,您能详细说明for循环(拆分字符串的常量行)是什么吗是吗?@gustav实际上它应该可以工作。for循环正是你的
for(var i=0…
loop)的美丽形式,这其实不是一个坏主意!非常感谢:)我怎样才能识别注释的*/结尾并重新开始计数呢?这其实不是一个坏主意