将字符串分解为三个块,但最少计数为两个

时间:2016-05-10 09:32:07

标签: javascript arrays regex match

我需要将一串数字分成三个块,但我不能允许一个块只包含一个数字,它必须包含至少两个数字。

例如

[123],[456],[7] - 这是不可接受的,因为7留在了它自己的

[123],[45],[67] - 这是可接受的解决方案

我几乎到了那里,但我不知道如何处理以确保至少有两位数字。

这是我的解决方案,它将字符串分为三部分但不考虑最小数字计数:

function solution(s) {
    var number = s.replace(/\D/g, '');
    number = number.match(/.{1,3}/g); // breaks down into threes
    number = number.join('-');
    return number;
}

这是一个可以看到它的代码:http://codepen.io/franhaselden/pen/mPobNb

1 个答案:

答案 0 :(得分:2)

您可以使用前瞻性的正则表达式。

Positive Lookahead在等号后面查找模式,但不会在匹配中包含它。

  

<强> X(ω= Y)

     

匹配&#39; x&#39;只有当&#39; x&#39;之后是&#39; y。这称为前瞻。

     

例如,/Jack(?=Sprat)/匹配&#39;杰克&#39;只有紧随其后的是Sprat&#39;。 /Jack(?=Sprat|Frost)/匹配杰克&#39;只有在其后面跟着'Sprat&#39;或者&#39;弗罗斯特&#39;但是,没有&#39; Sprat&#39;也不是&#39;弗罗斯特&#39;是比赛结果的一部分。

Online RegEx

&#13;
&#13;
function format(s) {
    return s.toString().replace(/\d{2,3}(?=..)/g, '$&-');
}

document.write(format(123456789) + '<br>');
document.write(format(12345678901) + '<br>');
document.write(format(1234567) + '<br>');
&#13;
&#13;
&#13;

修改

虽然我没有找到,通过数组需要一个额外的循环,但是这个提议为你提供了String#match()所需的步骤,以便稍后使用以下正则表达式连接数组:

  

/.{2,3}(?=..)|.+/g

     
      
  • 1st替代方案:.{2,3}(?=..)   

         
        
    • .{2,3} 匹配任何字符(换行符除外)
        Quantifier: {2,3}23次之间,尽可能多次,根据需要回馈[greedy]

    •   
    • (?=..) 肯定前瞻 - 断言下面的正则表达式可以匹配
        .匹配任何字符(换行符除外)
        .匹配任何字符(换行符除外)

    •   
  •   
  • 2nd替代方案:.+

         
        
    • .+ 匹配任何字符(换行符除外)
        Quantifier: +oneunlimited次之间,尽可能多次,根据需要回馈[greedy]
    •   
  •   
  • g modifier:全球。所有比赛(首场比赛都没有回复)

  •   

&#13;
&#13;
var a, i, s = '';

for (i = 1; i < 10; i++) {
    s += i;
    a = s.match(/.{2,3}(?=..)|.+/g);
    document.write(a.join('-') + '<br>');
}
&#13;
&#13;
&#13;