为什么正则表达式在不止一个#时不匹配?

我刚刚遇到下面的函数:

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-fd])([a-fd])([a-fd])$/i;
  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
     return r + r + g + g + b + b;
  });

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

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

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

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

为什么它是空的? 为什么不匹配,当我在这里检查正则表达式检查器中的正则表达式时:

它说以下内容:

#? 匹配字符#字面量词:? 在零次和一次之间,尽可能多次,根据需要回馈[贪婪]

现在上面的语句尽可能多地表示,为什么##fff与正则表达式不同/^#?([afd])([afd])([afd])$/i


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

“零和一次之间,最好是一次,但如果有必要,也允许为零(贪婪)”

一般来说,贪婪的匹配意味着“尽量匹配”,但在这种情况下,最大允许的数量是1

^#?([a-fd])

手段

  • 在字符串的开始处开始匹配。
  • 匹配一个(可选) #
  • 然后匹配十六进制数字。
  • 这显然失败与##1 (这不受懒惰或贪婪在这种情况下)。


    你需要+

    ^#+?([afd])([afd])([afd])$

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

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

    编辑:

    它实际上可以简化为^#+([afd])([afd])([afd])$因为@TimPietzcker提到,以下标记不能匹配#


    散列后需要一个'+'。

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

    您的正则表达式将是^#+?([afd])([afd])([afd])$

    链接地址: http://www.djcxy.com/p/13413.html

    上一篇: Why does regex not match when there are more then one #?

    下一篇: Regex match for HTML tag containing "on" JS trigger