为什么正则表达式在不止一个#时不匹配?
我刚刚遇到下面的函数:
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])$
上一篇: Why does regex not match when there are more then one #?