正则表达式后带有不确定字符的String.match()

时间:2014-01-27 18:56:18

标签: javascript regex

如果我在这样的Javascript中有一个字符串:

var html = '"<div class="info" id="infobox">Average Speed: 83kph<br/><br/>Max Speed: 95kph<br/><br/>Event Started At: 42.929126, -78.834093<br/><br/>Event Last Recorded At: 42.920754, -78.843596<br/><br/>Event Duration: 0H, 0M, 56S <br/><br/>";

我想在':'之后存储所有子字符串,我如何使用match()方法执行此操作?我想我想要一个正则表达式为':%indeterminateAmountofCharacters&lt;'的东西。

我希望冒号/空格是开头,然后是'&lt;'作为结束的指标,我想将其中的所有内容保存为match()将返回的数组中的元素。

Ie. ['83kph', '95kph', '42.929126, -78.834093', '0H, 0M, 56S ']

3 个答案:

答案 0 :(得分:1)

听起来你想要一个这样的模式:

/: (.*?)</

这将匹配一个:字符,后跟空格,后跟零个或多个任何字符,非贪婪地,在第1组中捕获,后跟一个<字符。

不幸的是,使用此方法调用.match只会返回第一个匹配项:

html.match(/: (.*?)</) // [": 83kph<", "83kph"]

添加全局标记(g)将为您提供所有匹配,但不会按组分隔:

html.match(/: (.*?)</g) 
// [": 83kph<", ": 95kph<", ": 42.929126, -78.834093<", ": 42.920754, -78.843596<", ": 0H, 0M, 56S <"]

一种解决方案是使用.split,然后.filter使用其他所有元素,如下所示:

html.split(/: (.*?)</).filter(function(x, i) { return i % 2 ; });
// ["83kph", "95kph", "42.929126, -78.834093", "42.920754, -78.843596", "0H, 0M, 56S "]

或在循环中使用.exec

var re = /: (.*?)</g,
    results = [],
    match;
while (match = re.exec(html)) {
    results.push(match[1]);
}
console.log(results);
// ["83kph", "95kph", "42.929126, -78.834093", "42.920754, -78.843596", "0H, 0M, 56S "]

答案 1 :(得分:1)

您可以进行全局“搜索,不要替换”。但是,您必须半手动执行子组捕获。

var matches = [];
html.replace(/: (.*?)</g, function () {
    matches.push(arguments[1]);
});

http://jsfiddle.net/kh35R/

答案 2 :(得分:0)

编辑:p.s.w.g打败了我。

这应该有效:

:\s(.*?)<

See it in action.