在正确的地方添加一个空格到英国邮政编码 Javascript

Posted

技术标签:

【中文标题】在正确的地方添加一个空格到英国邮政编码 Javascript【英文标题】:Add a space to UK Postcode in correct place Javascript 【发布时间】:2015-12-08 09:02:58 【问题描述】:

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

英国邮政编码在邮政编码字符串的最后一位数字之前始终有一个空格。

一些没有间距但间距正确的例子:

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;

当我更改设置的 postcost 时,我得到以下结果:

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

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

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

【问题讨论】:

使用replace方法更简单。 【参考方案1】:

我应该使用string.replace

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

DEMO

【讨论】:

【参考方案2】:

您可以使用 replace() 和正则表达式,您需要在末尾的 3 个字母之前放置空格

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

【讨论】:

【参考方案3】:

正如其他人都在回答,.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;

【讨论】:

【参考方案4】:
var postCode = "OX144FB";

return postCode.replace(/^(.*)(\d)(.*)/, "$1 $2$3");

【讨论】:

【参考方案5】:

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

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

或使用贪婪:

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

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

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

【讨论】:

【参考方案6】:

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

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

DEMO - 它甚至可以使用多个空格!

【讨论】:

以上是关于在正确的地方添加一个空格到英国邮政编码 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

带空格的英国邮政编码正则表达式

英国邮政编码中的空格

带有空格的英国邮政编码的Java正则表达式[重复]

如果字符串中还没有空格,如何在字符串中添加空格?

格式化英国邮政编码以进行存储

英国邮政编码列表 - 最近的五个邮政编码列表