我刚刚遇到以下功能:
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
不匹配?
答案 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 :(得分:0)
你的哈希后需要一个'+'。
使用'+'前面的项目将匹配一次或多次。
你的正则表达式将是^#+?([a-f\d])([a-f\d])([a-f\d])$