3

如果字符串符合某种格式,我正在尝试在字符串中插入一些空格。具体来说,如果字符串仅包含数字,并且长度正好是五个字符,则应在第三个和第四个数字之间添加空格。

这是我的测试用例:

function codeAddress() {
    var num_regex = /^\d+$/,
            input = $("#distributor-search").val(),
          address = (input.match(num_regex) && input.length == 5) ? input.split('').splice(3, 0 , ' ').join() : input ;

    console.log('The address is: ' + address);

    return false;
}

出于某种原因,链接.split(), .splice()and.join()似乎没有返回任何东西。我哪里错了?

4

4 回答 4

6

split()返回一个数组,splice()返回包含已删除元素的数组,并按join()应有的方式返回连接的数组。

看起来一切都出错了splice()。你得到的不是剩余的,而是被移除的项目。

我的测试:

var input = '123,789';
var output = input.split(',').splice(1, 0, '456').join(',');

console.log(output); // outputs nothing, because `splice(1, 0, '456')` doesn't remove any values

您可以通过制作一个使用 splice 功能的原型来解决这个问题,如下所示:

Array.prototype.isplice = function() {
    var tmp = this;

    Array.prototype.splice.apply(tmp, Array.prototype.isplice.arguments);

    return tmp;
};

var output = input.split(',').isplice(1, 0, '456').join(',');
console.log(output); // outputs ["123", "456", "789"] as expected
于 2013-01-10T14:57:17.123 回答
3

正如其他人所解释的那样,您的函数不起作用,因为.splice()返回已删除的元素,而不是结果数组。

尝试使用此正则表达式,而不是:

/^(\d\d\d)(\d\d)$/

它只会匹配一个长度为 5 位的字符串,它不会修改其他字符串。

例子:

var s = '123456'.replace(/^(\d\d\d)(\d\d)$/, '$1 $2');
// "123456"
var s = '1234'.replace(/^(\d\d\d)(\d\d)$/, '$1 $2');
// "1234"
var s = '12345'.replace(/^(\d\d\d)(\d\d)$/, '$1 $2');
// "123 45"

所以,在你的情况下:

address = $("#distributor-search").val().replace(/^(\d\d\d)(\d\d)$/, '$1 $2');
于 2013-01-10T14:56:41.163 回答
2

为什么不只使用正则表达式本身?

var num_regex = /^(\d\d\d)(\d\d)$/,
        input = $("#distributor-search").val(),
      address = input.match(num_regex);
if (address) address = address[1] + ' ' + address[2];

该正则表达式匹配一个五位数的字符串,并将前三位和后两位组合在一起。如果测试字符串匹配,则该.match()函数返回一个数组,其中两个组位于位置 1 和 2(位置 0 是整个匹配项)。

于 2013-01-10T14:53:03.883 回答
1

在您的情况下,您不能将 splice 与 join 连接:

splice(3, 0 , ' ').join()

请记住 splice 返回一个包含已删除项目的新数组,而不是结果数组。

于 2013-01-10T15:01:31.510 回答