怎么样:
// 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);