我想要一个匹配某个模式的字符串中所有出现的正则表达式:
\d+
我的字符串是一个CSS规则,所以我知道它以属性开头,应以分号结尾。我想得到中间的东西。
例如,在字符串中:
margin: 0px 3px 2px;
我希望得到:
0px 3px 2px
我正在尝试这样的事情:
margin:\s*?(\d+)px
但它只匹配第一个。然后我不知道如何说数字之后,可以是两个字符(em | px),只有一个(%)或者根本没有。
任何正则表达大师都可以帮助我?
我更喜欢打开一个新问题,但这篇文章与我的上传相关:CSS Regular Expression
答案 0 :(得分:1)
怎么样:
// 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对象,就像[]
等同于{ {1}}。使用new Array()
构造创建RegExp对象的正确方法是传递两个字符串参数。第一个是模式,第二个是标志。所以它上面会变成:new RegExp
。
第二件事是new RegExp('\d+(?:px|em)?', 'g')
方法总是返回第一个匹配(不是全部),所以它不会对你所追求的东西起作用。
因此,要在脚本中的几个位置重用该正则表达式,您必须将其分配给变量,然后传递给.exec()
函数。它看起来像这样:
.match()
答案 1 :(得分:0)
我认为您应该尝试margin:\s*?(\d+)px
margin:.*?;
带有像
这样的后引用 margin:(.*?);
答案 2 :(得分:0)
也许你需要这个:
var re = /^\w+:(.+);$/;
var st = "margin: 0px 3px 3px;";
re.exec(st);
或在Regex Tester中弄清楚它。 将网站保留在您的收藏夹中以备将来使用