如何在JavaScript中将字符串重新格式化为 3位数字,用短划线( - )分隔?
例如:
let myString = "00 64 33 3-44-23 982- 23-1-0"
产生所需的输出:
myString = "006-433-344-239-822-310"
答案 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)))));