Jon*_*a33 1 javascript regex string
我如何在JavaScript 中将字符串重新格式化为由短划线( - )分隔的3位数字块?
例如:
let myString = "00 64 33 3-44-23 982- 23-1-0"
Run Code Online (Sandbox Code Playgroud)
产生所需的输出为:
myString = "006-433-344-239-822-310"
Run Code Online (Sandbox Code Playgroud)
正则表达式:
("00 64 33 3-44-23 982- 23-1-0").replace(/\D/g,"").replace(/(\d{3})(?!$)/g,'$1-')
Run Code Online (Sandbox Code Playgroud)
说明:
\D - 删除所有非数字字符
(\d{3})(?!$)
(\d{3}) - 匹配3个号码(?!$) - 但不是最后3要转0 - 22 1985--324成022-198-53-24:
("0 - 22 1985--324")
.replace(/\D/g,"") // strip numbers
.replace( // do specific format
/^(\d{3})(\d{3})(\d{2})(\d{2})$/g,
'$1-$2-$3-$4'
)
Run Code Online (Sandbox Code Playgroud)
根据您在评论中所说的内容,我相信您希望在可能的情况下进行 3 组,如果没有足够的数字,则最后需要 2 组。我相信这会做到:
[
'1-2 3 45---67 890',
'12345678901',
'123456789012',
'1234567890123',
'12345678901234',
'1',
'12',
'123',
'1234',
'12345',
'123456',
'1234567'
].forEach(function(str) {
console.log(str.replace(/\D/g, '').replace(/(\d\d\d?)(?=\d\d)/g, '$1-'));
});Run Code Online (Sandbox Code Playgroud)
将/\D/g删除所有非数字。(\d\d\d?)如果可以,捕获组将尝试抓取 3 位数字(RegExp 是贪婪的,因此它们会尽可能多地抓取)但如果它无法抓取 3 位数字,?则第三位数字是可选的。前瞻(?=\d\d)要求在初始捕获后至少还有 2 个数字。这样做的结果是,如果字符串中剩余 5 位或更多位,这将导致捕获中包含 3 位数字,但如果仅剩 4 位,它将应用?仅抓取 2 位数字。
当使用g标志进行多个匹配时,字符串在一次运行中从头到尾消耗。每次进行比赛时,它都不会再次回到起点,而是继续进行。这意味着匹配永远不会重叠。Lookaheads 提供了一种检查接下来会发生什么而不将其包含在比赛中的方法,以便您可以有效地倒带。
理解这个 RegExp 的关键是观察到我们-在结果中插入 a 的任何地方,它之后必须始终至少多 2 个数字。在英语中,它被翻译为“如果我们可以抓取 3 个数字(或者如果我们不能抓取 2 个数字),只要还有 2 个数字还没有出现”。
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |