【问题标题】:Greedy regex javascript贪婪的正则表达式 javascript
【发布时间】:2025-12-05 17:10:01
【问题描述】:

我正在研究以下正则表达式:

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"

希望这是有道理的。感谢您的帮助。

【问题讨论】:

  • 一方面,您忘记转义您的-s。
  • @Doorknob 未转义的 - ?
  • 当我在 Fiddle 中测试你的代码时,match[1]undefinedmatch[2]normalmatch[6]-caps fantasy, sans-serif:见 jsfiddle.net/tC7T7。这让我觉得您发布的代码之外有问题。

标签: javascript regex match regex-greedy


【解决方案1】:

使最后一部分不贪心,而不是([a-zA-Z\-\,\'\"\s]+)做:

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

而且不需要转义所有这些字符:

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

【讨论】: