当有多个#时,为什么正则表达式不匹配?

时间:2016-04-18 06:00:34

标签: javascript regex

我刚刚遇到以下功能:

function hexToRgb(hex){
  // By Tim Down - http://stackoverflow.com/a/5624139/3493650
  // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
     return r + r + g + g + b + b;
  });

现在我在浏览器控制台中尝试了以下正则表达式:

s = "#ddd"
s.match(/^#?([a-f\d])([a-f\d])([a-f\d])$/i) // RESULT ["#ddd", "d", "d", "d"]

现在我将s更改为以下内容:

s = "##ddd"
s.match(/^#?([a-f\d])([a-f\d])([a-f\d])$/i) // null

为什么它为空?当我检查正则表达式检查器中的正则表达式时,为什么不匹配 here

它说:

  

#?匹配字符#sicalrally Quantifier :?在零到一次之间,尽可能多次,根据需要回馈[贪心]

现在上述声明尽可能多次说明,为什么##fff与正则表达式/^#?([a-f\d])([a-f\d])([a-f\d])$/i不匹配?

3 个答案:

答案 0 :(得分:3)

您需要+

^#+?([a-f\d])([a-f\d])([a-f\d])$

+匹配前面一个或多个令牌。

?使前面的量词变得懒惰,使其匹配尽可能少的字符。

修改:

它实际上可以简化为^#+([a-f\d])([a-f\d])([a-f\d])$,因为正如@TimPietzcker所提到的,以下令牌无法与#匹配。

答案 1 :(得分:2)

Regex101给出的解释可能会被误解。我会把它重写为

  

"在零到一次之间,最好是一次,但如果有必要也允许零(贪婪)"

一般来说,贪婪的匹配意味着尽可能多地匹配",但在这种情况下,允许的最大数量为1

^#?([a-f\d])

装置

  1. 在字符串的开头开始匹配。
  2. 匹配一个(可选)#
  3. 然后匹配十六进制数字。
  4. ##1显然失败了(在这种情况下,这不会受到懒惰或贪婪的影响)。

答案 2 :(得分:0)

你的哈希后需要一个'+'。

  

使用'+'前面的项目将匹配一次或多次。

你的正则表达式将是^#+?([a-f\d])([a-f\d])([a-f\d])$