用正则表达式拆分字符串 - 正则表达式太贪心

时间:2017-04-09 20:49:12

标签: javascript regex

我正在尝试拆分并提取格式为linear-gradient(...)的所有字符串,该字符串可能包含多个匹配项,例如 linear-gradient(...), linear-gradient(...)

我的正则表达式只适用于一次,但我不能让它在第一次出现后不贪婪。任何帮助将不胜感激。

A regex101 version

适用于单次事件的正则表达式

/.*gradient\s*\(((?:\([^\)]*\)|[^\)\(]*)*)\)/g

要拆分的字符串

linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgb(0, 0, 0) 100%), linear-gradient(to bottom, rgb(177, 186, 206) 0%, rgb(92, 158, 79) 50%, rgb(135, 218, 232) 100%)

javascript



var aGradient = [];
var gradientString = "linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgb(0, 0, 0) 100%), linear-gradient(to bottom, rgb(177, 186, 206) 0%, rgb(92, 158, 79) 50%, rgb(135, 218, 232) 100%)";
var regex = /.*gradient\s*\(((?:\([^\)]*\)|[^\)\(]*)*)\)/g;
var match;
while (match = regex.exec(gradientString)) {
  aGradient.push(match[0]);
  console.log(match[0]);
}




1 个答案:

答案 0 :(得分:1)

模式开头的.*部分与除了换行符之外的任何0+字符匹配尽可能多的。这意味着,你只能在一条线上获得最后一场比赛。

您似乎只需要匹配-gradient前面的任何字词。将.*替换为\w+-

\w+-gradient\s*\(((?:\([^()]*\)|[^()]*)*)\)
^^^^

请参阅regex demo\w+匹配1个或多个字母/数字/ _

如果您知道可以存在的值,请使用交替组:

(?:linear|radial)-gradient\s*\(((?:\([^()]*\)|[^()]*)*)\)
^^^^^^^^^^^^^^^^^

(?:linear|radial)组将匹配linearradial

注意:您不需要在字符类中转义()