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

时间:2017-09-15 02:02:06

标签: javascript regex string

如何在JavaScript中将字符串重新格式化为 3位数字,用短划线( - )分隔?

例如:

let myString = "00  64 33 3-44-23 982-  23-1-0"

产生所需的输出:

myString = "006-433-344-239-822-310"

4 个答案:

答案 0 :(得分:6)

使用正则表达式:

("00  64 33 3-44-23 982-  23-1-0").replace(/\D/g,"").replace(/(\d{3})(?!$)/g,'$1-')

说明:

  • \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'
  )

答案 1 :(得分:3)

首先,您可以使用'replace'删除任何带有正则表达式的非数字字符。

let myString = "00  64 33 3-44-23 982-  23-1-0"
myString = myString.replace(/\D/g, "")

// "006433344239822310"

其次,'匹配'任意数字(0-9)1至3次。匹配函数方便地返回一个数组,其中包含每个匹配项。

myString = myString.match(/\d{1,3}/g)

// [006,433,344,239,822,310]

最后,使用“ - ”作为分隔符加入数组。

myString = myString.join("-");

// 006-433-344-239-822-310

如果您想将每一步联系起来......

myString = myString.replace(/\D/g, "").match(/\d{1,3}/g).join("-");

请注意,如果字符串有任何剩余数字,它们将保留在字符串末尾的各自块中。这是由于1-3匹配。

例如......

"00  64 33 3-44-23 982-  23-1-0  24" // before - with 2 extra digits
"006-433-344-239-822-310-24" // after - the extra digits are maintained

答案 2 :(得分:2)

根据您在评论中所说的内容,我认为如果没有足够的数字,您可能希望尽可能使用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-'));
});




/\D/g删除所有非数字。捕获组(\d\d\d?)将尝试抓取3位数(如果RegReps贪婪,以便尽可能多地抓取),但如果它不能抓住3位数?使得第三位数可选的。前瞻(?=\d\d)要求在初始捕获后至少有2个数字。结果是,如果字符串中剩余5个或更多数字,这将导致捕获中包含3个数字,但如果只剩下4个数字,它将应用?仅抓取2个数字。

使用g标志进行多次匹配时,字符串将在一次运行中从头到尾消耗。每次进行比赛时,它都不会再次回到起点,它只会继续。这意味着匹配永远不会重叠。 Lookaheads提供了一种方法来检查接下来会发生什么,而不会在比赛中包含它,以便您可以有效地倒带。

理解这个RegExp的关键是观察到,无论我们在结果中插入-,其后必须至少有2位数。在英语中,如果可以的话,它会翻译为'抓住3位数字(如果我们可以,则为2),只要还有2位数字即将到来

答案 3 :(得分:1)

这是一个非正则表达式解决方案:

joinGroups(joinDigits(partition3(extract(string))))

joinGroups只是

// Join groups of digits with a hyphen.
const joinGroups = a => a.join('-');

joinDigits也很容易:

// Join elements of subarrays together into strings.
const joinDigits = groups = groups.map(group => group.join(''));

extract也很简单:

// Extract all digits from a string and return as array.
const extract = input => input.match(/\d/g);

partition3有点困难。 SO和其他地方有很多样本。请参阅代码段中的实现,了解一个想法。

const joinGroups = a => a.join('-');
const joinDigits = groups => groups.map(group => group.join(''));
const extract = input => input.match(/\d/g);
const partition = n => 
  a => Array.from(
    {length: Math.floor((a.length - 1) / n) + 1}, 
    (_, i) => a.slice(i * n, (i + 1) * n));

const partition3 = partition(3);

const data = "00  64 33 3-44-23 982-  23-1-0";

console.log(joinGroups(joinDigits(partition3(extract(data)))));