从本文中提取数字的最佳方法是什么?

时间:2014-08-01 00:50:54

标签: javascript regex split substring

P1W2DT6H21M32S

想知道从这里提取数字的最佳方法。

W = Weeks
D = Days
H = Hours
M = Minutes
S = Seconds

这样的东西只适用于M和S,看起来我做得不对。

    var time = "PT44M7S";
    var minutes = time.substring(2, time.indexOf("M"));
    var seconds = time.split("M")[1].substring(0, time.split("M")[1].indexOf("S"));

6 个答案:

答案 0 :(得分:2)

var timePeriod = {};
var str = 'P1W2DT6H21M32S';
var re = /(\d+)([WDHMS])/g;
while (result = re.exec(str)) {
    timePeriod[result[2]] = parseInt(result[1], 10);
}
console.log(timePeriod);

应该产生:

{ W: 1, D: 2, H: 6, M: 21, S: 32 }

答案 1 :(得分:1)

你可以拆分字母,虽然你会在数组中得到前导和尾随空格:

'P1W2DT6H21M32S'.split(/[A-Z]/)

答案 2 :(得分:1)

使用正则表达式,您可以“选择性地捕获”每个组,然后根据需要调用它们:

(?:(\d+)W)?(?:(\d+)D?)?(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?

Example

var re = /(?:(\d+)W)?(?:(\d+)D?)?(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/gm; 
var str = 'P1W2DT6H21M32S\nPT44M7S\n';
var subst = 'Week: $1\nDay: $2\nHour: $3\nMinute: $4\nSecond: $5\n'; 
var result = str.replace(re, subst);

答案 3 :(得分:0)

如何删除末尾的非数字然后拆分剩余的非数字块?

var justNumbers = "P1W2DT6H21M32S".replace(/^\D|\D$/g, "").split(/\D+/);

那应该给你一个很好的数组。

如果要将生成的数组值存储在更易于理解的对象中,可以添加以下内容:

var keys = ["weeks", "days", "hours", "minutes", "seconds"];

var time = {};

for (var k = 0; k < keys.length; k++) {
    time[keys[k]] = justNumbers[k];
}

JSFiddle:http://jsfiddle.net/briansexton/AXh7F/

答案 4 :(得分:0)

考虑一个正则表达式,例如:

/P(?:(\d+)W)?(?:(\d+)D)?T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/

然后值将在组中1 = W,2 = D,3 = H,4 = M,5 = S.

这种类似于普通拆分的优点是,如果省略了任何字段,它仍然可以正常工作 - 只要提供的字段保持有序。

答案 5 :(得分:0)

我不知道为什么会有这两个字母:P和T.但是因为它们在那里你需要删除它们。因此,您可以拆分文本,然后从刚刚获得的数组中删除空字符串:

var time = 'P1W2DT6H21M32S';

time = time.split(/[A-Z]/);
time = time.join(',').replace(/,,/g, ',').substr(1).slice(0, -1).split(',');

> ["1", "2", "6", "21", "32"]