正则表达式Javascript全部出现

时间:2012-12-10 13:34:52

标签: javascript regex

我想要一个匹配某个模式的字符串中所有出现的正则表达式:

\d+

我的字符串是一个CSS规则,所以我知道它以属性开头,应以分号结尾。我想得到中间的东西。

例如,在字符串中:

margin: 0px 3px 2px;

我希望得到:

0px 3px 2px

我正在尝试这样的事情:

margin:\s*?(\d+)px

但它只匹配第一个。然后我不知道如何说数字之后,可以是两个字符(em | px),只有一个(%)或者根本没有。

任何正则表达大师都可以帮助我?

我更喜欢打开一个新问题,但这篇文章与我的上传相关:CSS Regular Expression

3 个答案:

答案 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中弄清楚它。 将网站保留在您的收藏夹中以备将来使用