重新格式化字符串 - Javascript

时间:2018-05-19 13:41:52

标签: javascript

我已经获得了一项必须在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);
} 

干杯

5 个答案:

答案 0 :(得分:0)

  1. 您在if块中使用了赋值运算符(=)而不是等号运算符(==)。

  2. 正如您的代码所示,'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)

一种方法是首先删除所有数字,然后在每第三个数字上拆分。然后使用-

加入数组

&#13;
&#13;
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;
&#13;
&#13;