以3位数的块格式化字符串

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)

Isa*_*aac 6

正则表达式:

("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--324022-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)


ski*_*tle 5

根据您在评论中所说的内容,我相信您希望在可能的情况下进行 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 个数字还没有出现”