我需要将一串数字分成三个块,但我不能允许一个块只包含一个数字,它必须包含至少两个数字。
例如
[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
答案 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;是比赛结果的一部分。
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;
修改
虽然我没有找到,通过数组需要一个额外的循环,但是这个提议为你提供了String#match()
所需的步骤,以便稍后使用以下正则表达式连接数组:
/.{2,3}(?=..)|.+/g
1st
替代方案:.{2,3}(?=..)
.{2,3}
匹配任何字符(换行符除外)
Quantifier:
{2,3}
在2
和3
次之间,尽可能多次,根据需要回馈[greedy]
(?=..)
肯定前瞻 - 断言下面的正则表达式可以匹配
.
匹配任何字符(换行符除外)
.
匹配任何字符(换行符除外)
2nd
替代方案:.+
.+
匹配任何字符(换行符除外)
Quantifier:
+
在one
和unlimited
次之间,尽可能多次,根据需要回馈[greedy]
g modifier
:全球。所有比赛(首场比赛都没有回复)
var a, i, s = '';
for (i = 1; i < 10; i++) {
s += i;
a = s.match(/.{2,3}(?=..)|.+/g);
document.write(a.join('-') + '<br>');
}
&#13;