每 3 位数字后屏蔽并插入连字符

Mask and insert hyphen after every 3 digits

提问人:Karan Nayyar 提问时间:10/5/2023 更新时间:10/6/2023 访问量:91

问:

我正在尝试替换以下字符串,如下所示:

var phone = "9871234567"
result = xxx-xxx-4567

以下是我处理过的 js 代码,但这并没有给我正确的结果。

var lastphdigit = phone.replace(/\d(?=(?:\D*\d){4})/g, "x");
var lastphdighyp = lastphdigit.replace(/.{3}(?!$)/g, '$&-'); //xxx-xxx-456-7
JavaScript 正则表达式 字符串 替换 Rhino

评论

0赞 Wiktor Stribiżew 10/5/2023
.replace(/\d{3}(?!\d?$)/g, 'xxx-')regex101.com/r/XNMOer/1
1赞 Tim Biegeleisen 10/5/2023
这些都是美国电话号码吗?
2赞 gog 10/5/2023
如果少于或超过 10 位数字会发生什么?

答:

2赞 depperm 10/5/2023 #1

对于此问题,正则表达式不是必需的。使用会简单得多,只需获取最后 4 位数字即可slice

var phone = "9871234567"
console.log(`xxx-xxx-${phone.slice(6)}`)

评论

0赞 Cary Swoveland 10/6/2023
你的答案和威尔科的答案实际上是一样的(而且非常好),但因为你的答案是第一位的,所以你得到了我的赞成票。如果发布时间的差异足够小,我也会投票给 Wilco,但 SO 明智地不再提供低至秒的发布时间。现在,我看到两个答案都“4 小时前回答”。SO:我们不需要你缩短发布时间。
0赞 Karan Nayyar 10/12/2023
@depperm 如果有一些特殊字符,如括号、空格怎么办?例如,var phone = “9871234567)”,则结果为 xxx-xxx-567)。如果字符串末尾有一些乱码或括号、空格等,我们如何处理这种情况。我们只需要显示最后 4 位数字。
0赞 depperm 10/12/2023
@KaranNayyar这不是常见的电话号码格式。如果数字之间有破折号,这是行不通的,在这种情况下,我建议 Wilco 回答。无论哪种方式,正则表达式都不是必需的
3赞 Wilco 10/5/2023 #2

受到@depperm给出的评论的启发,为什么不尝试一下呢? 我们从电话号码中切掉 4 位数字,从末尾开始,然后将其附加到静态字符串中。

var phone = "9871234567";
var maskedPhone = "xxx-xxx-" + phone.slice(-4);
console.log(maskedPhone)

这样,如果电话号码中的数字数量是可变的,您仍将始终获得最后 4 位数字的屏蔽。 如果这是一个考虑因素,您还应该计算原始电话号码中的位数,并相应地添加 x。

2赞 The fourth bird 10/6/2023 #3

如果字符串中应该只有数字,并且您的 JavaScript 环境接受后视断言,则可以在左侧断言可选数字,匹配 3 位数字,同时在右侧断言 2 个或更多数字:

(?<=^\d*)\d{3}(?=\d{2,}$)

正则表达式演示

const phone = "9871234567"
const result = phone.replace(/(?<=^\d*)\d{3}(?=\d{2,}$)/g, "xxx-");
console.log(result);

如果始终有 10 位数字,则可以使用匹配项后跟捕获组,然后在替换中使用该捕获组。

^\d{6}(\d{4})$

正则表达式演示

const phone = "9871234567"
const result = phone.replace(/^\d{6}(\d{4})$/g, "xxx-xxx-$1");
console.log(result);