Жадный javascript с регулярным выражением

Я работаю над следующим регулярным выражением:

var match = string.match(/(?:(normal|italic|oblique))?\s*(?:(normal|small-caps))?\s*(?:((?:normal|bold|bolder|lighter|\d+(?:\%|in|cm|mm|em|rem|ex|pt|pc|px)))\/?)?\s*((?:(?:xx-small|x-small|small|medium|large|x-large|xx-large|larger|smaller|\d+(?:\%|in|cm|mm|em|rem|ex|pt|pc|px))\s*){1,2})?\s*(?:(normal|inherit|\d+(?:\%|in|cm|mm|em|rem|ex|pt|pc|px))\s*)?\s*(?:([a-zA-Z\-\,\'\"\s]+)\s*)?(?:,|;)(?:(caption|icon|menu|message-box|small-caption|status-bar)\s*)?/i);

Строка:

var string = "font: normal small-caps fantasy, sans-serif;"

Мне нужно, чтобы каждое из значений возвращалось на свое место в массиве совпадений, однако одно из совпадений слишком жадное. Результат таков:

match[1] = "normal"
match[2] = "small"
match[6] = "-caps fantasy, sans-serif"

Мне нужно, чтобы результат был:

match[1] = "normal"
match[2] = "small-caps"
match[6] = "fantasy, sans-serif"

Надеюсь, это имеет смысл. Спасибо за помощь.


person LeinardoSmtih    schedule 30.03.2014    source источник
comment
Во-первых, вы забыли сбежать от своих -.   -  person tckmn    schedule 30.03.2014
comment
@Doorknob, где не сбежавший - ?   -  person LeinardoSmtih    schedule 30.03.2014
comment
Когда я тестирую ваш код в Fiddle, match[1] соответствует undefined, match[2] соответствует normal, а match[6] соответствует -caps fantasy, sans-serif: см. jsfiddle.net/tC7T7. . Это заставляет меня думать, что за пределами кода, который вы разместили, что-то не так.   -  person GOTO 0    schedule 30.03.2014


Ответы (1)


Сделайте последнюю часть не жадной, вместо ([a-zA-Z\-\,\'\"\s]+) сделайте:

([a-zA-Z\-\,\'\"\s]+?)

И нет необходимости экранировать все эти символы:

([-a-zA-Z,'"\s]+?)
person Toto    schedule 30.03.2014