0

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

\d+

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

例如,在字符串中:

margin: 0px 3px 2px;

我希望得到:

0px 3px 2px

我正在尝试类似的东西:

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

但它只匹配第一个。那我不知道怎么说了,数字后面,可以是两个字符(em|px),也可以是一个(%)或者什么都没有。

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

我更喜欢打开一个新问题,但这篇文章与我之前的文章有关:CSS 正则表达式

4

3 回答 3

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 对象,就像[]等效于一样。使用构造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);
于 2012-12-10T13:44:36.530 回答
0

我认为margin:\s*?(\d+)px你应该尝试margin:.*?;

有回参考之类的

margin:(.*?);

于 2012-12-10T13:44:30.330 回答
0

也许你需要这个:

var re = /^\w+:(.+);$/;
var st = "margin: 0px 3px 3px;";
re.exec(st);

或在Regex Tester中摆弄它。将网站保存在您的收藏夹中以备将来使用

于 2012-12-10T13:46:31.323 回答