我已经获得了一项必须在javascript中重新格式化错误电话号码(即字符串)的任务。正确的输出必须是:123-456-789或123-456-789-11(取决于字符串中有多少个字符)?
我有一个基本的java背景,我仍然习惯了javascript的工作方式......
示例案例:
00-44 48 5555 8361
0 - 22 1985--324
555372654
示例案例应该是:
004-448-555-583-61
022-198-53-24
555-372-654
代码最终将忽略破折号和空格,以便生成正确的输出
这是我到目前为止所做的:
S = S.replace("", "");
for(var i = 0; i < n; i++) {
var after = S.replace(/(\d{3})(?=\d)/g, '$1-');
console.log(after);
}
干杯
答案 0 :(得分:0)
您在if块中使用了赋值运算符(=)而不是等号运算符(==)。
正如您的代码所示,'n'是字符串的长度。所以n.replace()不起作用。
答案 1 :(得分:0)
您可以使用正则表达式匹配三位数组。
var inputs = ['00-44 48 5555 8361', '0 - 22 1985--324', '555372654',
'123456798', '12345678911', '', '1'];
inputs.forEach(function(input) {
var strippedInput = input.replace(/[\s-]/g, '');
var formattedInput = strippedInput.replace(/(\d{3})(?=\d)/g, '$1-');
console.log(formattedInput);
});
正则表达式的作用是:
(\d{3})
(?=\d)
$1-
奇怪的看(?=\d)
是一个积极的先行,不包括之后的第四位数。这可以防止在格式化字符串的末尾添加多余的短划线。
请注意,您可以使用字符组[\s-]
在一个步骤中替换短划线和空格。
输出:
004-448-555-583-61
022-198-532-4
555-372-654
123-456-798
123-456-789-11
1
答案 2 :(得分:0)
使用S=["00-44 48 5555 8361","0 - 22 1985--324","555372654"]
您只需要一行:
S.map(str=>str.replace(/[- ]/g, "").match(/(\d{1,3})/g).join('-'));
将迭代你的字符串数组,删除所有空格和 - ,然后匹配1到3位数(先贪婪,所以3尽可能)并最终将这些匹配与-
之间加入。
运行以下示例:
console.log(
["00-44 48 5555 8361","0 - 22 1985--324","555372654"]
.map(str=>str.replace(/[- ]/g, '')
.match(/(\d{1,3})/g)
.join('-')
)
);
答案 3 :(得分:0)
解决此问题的一些常规技巧:
1)您可能希望首先从输入中删除空格和短划线,例如:
S = S.replace(" ", "")
2)您可以通过索引访问字符串中的某个字符,如下所示:
S[i] // e.g. "0"
3)要检查你是否在第三个位置需要添加破折号,只需在该位置使用modulo:
if(n % 3 === 0) { /* add - */}
4)您可以构建一个新字符串并使用+=
添加字符:
let result = "123";
result += "-";
答案 4 :(得分:0)
一种方法是首先删除所有数字,然后在每第三个数字上拆分。然后使用-
const tests = [
'123-15 68--5722',
'123-15 68 52',
'123--125--68--572',
'123 a b c 15 68 d efg 52',
]
function format(num) {
// Remove everything that isn't a number
return num.replace(/[^0-9]/g, '')
// Spilt on every 3rd number
.match(/\d{1,3}/g)
// Join with dashes
.join('-')
}
tests.forEach(num => console.log(format(num)))
&#13;