2017-04-10 62 views
1

我要让构成此字符串的应用程序:增量X在字符串

1.2.3.X

进入这个字符串:

1.2.3.0

1.2.3.1

1.2.3.2

1.2.3.3

1.2.3.4

......

等等 我做了这个代码:

String.prototype.count=function(c) { 
 
    var result = 0, i = 0; 
 
    for(i;i<this.length;i++)if(this[i]==c)result++; 
 
    return result; 
 
}; 
 
var x = ["","","","","","","","","","","","","",""] 
 
var brutenumber = "" 
 
var ip = "1.2.X.X" 
 
if (ip.count(".") >= 4) { 
 
console.log("Non valid IP Input"); 
 
} 
 
else { 
 
    numberX = ip.count("X"); 
 
    if (numberX < 1) { 
 
    console.log("No X given.") 
 
    } 
 
    else if (numberX > 12) { 
 
    console.log("Too many X given! Result can't be an IP") 
 
    } 
 
    else { 
 
    for (i = 1;i <= numberX ; i++) { 
 
     brutenumber = brutenumber + "9"; 
 
     
 
    } 
 
    } 
 
    
 
for (d = 0;d <= brutenumber; d++) { 
 
    var lastchar = d.toString().slice(-1); 
 
    console.log(lastchar) 
 
/*var wee = d.toString().substring(0,1); 
 
console.log(wee)*/ 
 

 
} 
 
}

我的应用程序已经计算出你需要多少试图让所有的可能性, 但现在我遇到了一个问题: 我的代码应该产生号码,如001,在for循环

for (d = 0 ;d <= brutenumber; d++) { 

的问题是:这生成数字如0,1 ... 10,11,12 因此,我将不得不设置字符串d像brutenumber,得到brutenumber的长度,然后做一个for循环,我< = brutenumber.length它增加了一个0字符串d所有的时间。 现在最大的问题:我必须在searchString中为X设置值1.2.3.X 我没有任何想法如何做到这一点。 (SearchString在不必须是1.2.3.X,它也可以是1.2.XX,127.0.XX,甚至XXX.XXX.XXX:d)

感谢

回答

1

那么远,因为我有了解你可能会想出这样的解决方案;

function ipListGenerator(s){ 
 
    var nos = Array(256).fill().map((_,i) => "0".repeat(2 - ~~Math.log10(i))+i); 
 
    return nos.map(no => s.replace(/x/i,no)); 
 
} 
 

 
var ipList = ipListGenerator("1.2.3.X"); 
 
console.log(ipList)
.as-console-wrapper { max-height: 100% !important; top: 0; }

或者你可以通过在一个如下合并两个.map()期关于进一步简化代码;

function ipListGenerator(s){ 
    return Array(256).fill().map((_,i) => s.replace(/x/i, "0".repeat(2 - ~~Math.log10(i))+i)); 
} 

根据您的评论..它显着简化了代码如下。

function ipListGenerator(s){ 
 
    return Array(10).fill().map((_,i) => s.replace(/x/i, i)); 
 
} 
 

 
console.log(ipListGenerator("1.2.3.x"));
.as-console-wrapper { max-height: 100% !important; top: 0; }

拉伸上述代码远一点,则可能有多个值x 0-9中被填充。然而正如我的评论中提到的那样,这是一个组合工作,根据x的数量,它可能会相当耗时。特别是因为上面的代码通过正则表达式进行字符串操作,它可能会变得更糟。我不建议您将此代码应用于超过5个字符串的字符串。

function fillxs(s){ 
 
    function runner(s){ 
 
    return Array(10).fill().map((_,i) => s.replace(/x/i, i)); 
 
    } 
 
    var xc = s.match(/x/ig).length; 
 
    result = [s]; 
 
    while (xc--) result = result.reduce((r,s) => r.concat(runner(s)),[]) 
 
    return result; 
 
} 
 

 
var nox = []; 
 
console.time("test"); 
 
nox = fillxs("1.1.1x3.x1x"); 
 
console.timeEnd("test"); 
 
console.log(nox);

+0

谢谢您的回答! – user5339049

+0

但是我有一个问题:当我放入1.​​2.3.X时,它打印出1.2.3.000,1.2.3.001 ..直到255,但它应该是1.2.3.0,1.2.3.1,1.2.3.2到9: ) – user5339049

+0

@GeT_rApEd所以让我把它弄好。当你输入“1.2.3.X”时,你期望只有10个字符串,如[“1.2.3.0”,“1.2.3.1”,“1.2.3.2”, ...,“1.2.3.8”,“1.2.3.9”]对..所以我在我的答案下面添加了一个代码。 – Redu