怎么样:
// returns array: ["0px", "3px", "2px"]
"margin: 0px 3px 2px;".match(/\d+(?:px|em)?/g)
使用g
(全局)标志来匹配整个字符串,而不是在第一次匹配时停止。
// other example - returns array: ["3em", "2px", "39"]
"margin: 3em 2px 39;".match(/\d+(?:px|em)?/g)
为了进一步阐明这是如何工作的:
\d+
匹配数字(一个或多个相互跟随)
(?:px|em)?
跳过捕获(但仍然匹配!)该组 - 查找 px 或 em 字符串。末尾的问号表示可能找不到整个组(当有没有单位的数字时)。
编辑:从下面的评论中回答 OP 问题。
这样做:由于两个原因new RegExp(/\d+(?:px|em)?/g).exex(mystring)
不起作用。首先 - 从另一个创建新的 RegExp 时,您不能提供标志 ( g
)(这里就是这种情况 -/\d+(?:px|em)?/g
等效于 RegExp 对象,就像[]
等效于一样。使用构造new Array()
创建 RegExp 对象的正确方法是传递两个字符串参数。首先new RegExp
是模式,第二个是标志。所以上面会变成:new RegExp('\d+(?:px|em)?', 'g')
。第二件事是该.exec()
方法总是返回第一个匹配项(不是全部),因此它不适用于您所追求的。
因此,要在脚本中的几个位置重用该正则表达式,您必须将其分配给变量,然后传递给.match()
函数。它可能看起来像这样:
var reg = new RegExp('\d+(?:px|em)?', 'g');
// somewhere down the road...
mystring.match(reg);
// and on some other string...
myotherstring.match(reg);