在正确的位置添加 space 到英国邮政编码 Javascript

Add a space to UK Postcode in correct place Javascript

我正在尝试编写一个基本函数,允许我将 space 添加到 space 已被删除的英国邮政编码。

英国邮政编码在邮政编码字符串的最后一位数字之前总是有一个 space。

一些没有间距和正确间距的示例:

CB30QB => CB3 0QB
N12NL => N1 2NL
OX144FB => OX14 4FB

要查找字符串中的最后一位数字,我是正则表达式 /\d(?=\D*$)/g,我目前使用的 Javascript 如下:

// Set the Postcode
var postCode = "OX144FB";

// Find the index position of the final digit in the string (in this case '4')
var postcodeIndex = postCode.indexOf(postCode.match(/\d(?=\D*$)/g));

// Slice the final postcode at the index point, add a space and join back together.
var finalPostcode = [postCode.slice(0, postcodeIndex), ' ', postCode.slice(postcodeIndex)].join('');

return finalPostcode;

我在更改设置的后期成本时得到以下结果:

CB30QB becomes CB3 0QB - Correct
N12NL becomes N1 2NL - Correct
CB249LQ becomes CB24 9LQ - Correct
OX144FB becomes OX1 44FB - Incorrect
OX145FB becomes OX14 5FB - Correct

问题似乎与具有相同值的两个数字有关,因为大多数其他组合似乎都有效。

有谁知道我该如何解决这个问题?

我应该使用 string.replace

string.replace(/^(.*)(\d)/, " ");

DEMO

var postCode = "OX144FB";

return postCode.replace(/^(.*)(\d)(.*)/, " ");

你可以用正则表达式replace(),你需要在最后3个字母前放置space

document.write('CB30QB'.replace(/^(.*)(.{3})$/,' ')+'<br>');
document.write('N12NL'.replace(/^(.*)(.{3})$/,' ')+'<br>');
document.write('CB249LQ'.replace(/^(.*)(.{3})$/,' ')+'<br>');
document.write('OX144FB'.replace(/^(.*)(.{3})$/,' '));

使用String.prototype.replace方法显然是最简单的方法:

return postCode.replace(/(?=\d\D*$)/, ' ');

或使用贪心:

return postCode.replace(/^(.*)(?=\d)/, ' ');

您之前的代码不起作用,因为您正在使用 indexOf 搜索与 String.prototype.match() 方法匹配的子字符串(即结束前的最后一位数字)。但如果这个数字在字符串中多次出现,indexOf 将 return 第一次出现的位置。

顺便说一句,当您想在字符串中查找匹配项的位置时,请使用 return 找到该位置的 String.prototype.search() 方法。

正如其他人所回答的那样,.replace() 更容易。但是,让我指出代码中的错误。

问题是您正在使用 postCode.indexOf() 查找匹配项的第一次出现。在这种情况下:

Text:     OX144FB
Match:        ^ match is correct: "4"

Text:     OX144FB
IndexOf:     ^ first occurence of "4"

要修复它,请使用 match 对象的 .index

// Find the index position of the final digit in the string (in this case '4')
var postcodeIndex = postCode.match(/\d(?=\D*$)/g).index;

这是一个老问题,但是虽然 Avinash Raj 的解决方案有效,但只有当您的所有邮政编码都没有 space 时,它才有效。如果你有混合,并且你想将它们正规化为单个 space,你可以使用这个正则表达式:

string.replace(/(\S*)\s*(\d)/, " ");

DEMO - 它甚至适用于多个 space!