【问题标题】:Regular expression to insert dash into numbers after 3 and 4 digits正则表达式在 3 位和 4 位数字后插入破折号
【发布时间】:2025-11-24 02:05:01
【问题描述】:

我正在尝试在数字中插入破折号,但这对我来说太难了... 我想要做的是在 3 位和 4 位数字之后插入破折号,例如,

123123412345 替换为123-1234-12345

附加条件是我将其替换为input 元素。所以我替换每个输入事件的数字,即我需要替换像

11
1212
123123
1231123-1
...
1231234123-1234
12312341123-1234-1
...
123123412345123-1234-12345

如何使用正则表达式来做到这一点??

【问题讨论】:

标签: javascript regex


【解决方案1】:

你可以试试这个正则表达式:

  • 正则表达式
(?<=^\d{3}|^\d{7})(?=\d)
  • 替换
-

查看proof

const list = [
  1,
  12,
  123,
  1231,
  1231234,
  12312341,
  123123412345
];

const regex = /(?<=^\d{3}|^\d{7})(?=\d)/g;
const result = list.map(e => regex[Symbol.replace](e, '-'));

console.log(result);

【讨论】:

  • 这感觉效率不高。在寻找符合条件的位置以添加- 时,您正在检查每个字符的两个lookbehinds 和一个lookaheads。对吗?
【解决方案2】:

假设只需要拆分前3位后4位,可以通过以下正则表达式替换来完成

str.replace(/((?<!\d)\d{3}(?!\b)|(?<=^\d{3})\d{4}(?!\b))/g, '$1-')

输入字符串必须是全数字

document.getElementById('input').addEventListener('keyup', (e) => {
e.target.value = e.target.value.split('-').join('').replace(/((?<!\d)\d{3}(?!\b)|(?<=^\d{3})\d{4}(?!\b))/g, '$1-');
});

['1', '12', '123', '1231', '12312', '123123', '1231234', '12312341', '123123412', '1231234123', '12312341234', '123123412345']
.forEach(t => console.log(t.replace(/((?<!\d)\d{3}(?!\b)|(?<=^\d{3})\d{4}(?!\b))/g, '$1-')));
&lt;input id="input" type="text" size="20"&gt;

【讨论】:

  • 你为什么会这样split().join()?为什么不直接用'' 替换'-',而不是生成一个数组并内爆它?
  • javascript有\B而不是(?!\b)吗?
  • ^\d{3}\B|(?&lt;=^\d{3})\d{4}\B$&amp;- 对我来说似乎更干净(更高效)
  • 谢谢。您提出了更好的选择。
最近更新 更多