Javascript Regexp匹配十六进制颜色语法(和缩写形式)

Javascript Regexp匹配十六进制颜色语法(和缩写形式),javascript,regex,Javascript,Regex,嗯,我对正则表达式非常陌生,尤其是JavaScript正则表达式 我正在寻找一个匹配十六进制颜色语法的regexp(比如"34ffa6) 然后我看了w3school页面: 那就是我的regexp: /^#[0-9a-f]{6}/i 它似乎可以工作,但是,如果我想它也匹配“短十六进制颜色语法”形式?(比如#3fa),有可能吗?我尝试过使用字符|,但可能语法有误。试试这个: /^#([0-9a-f]{6}|[0-9a-f]{3})$/i [0-9a-f]{6}=6个字符 [0-9a-f]{3}=

嗯,我对正则表达式非常陌生,尤其是JavaScript正则表达式

我正在寻找一个匹配十六进制颜色语法的regexp(比如
"34ffa6
) 然后我看了w3school页面:

那就是我的regexp:

/^#[0-9a-f]{6}/i
它似乎可以工作,但是,如果我想它也匹配“短十六进制颜色语法”形式?(比如
#3fa
),有可能吗?我尝试过使用字符
|
,但可能语法有误。

试试这个:

/^#([0-9a-f]{6}|[0-9a-f]{3})$/i
[0-9a-f]{6}
=6个字符
[0-9a-f]{3}
=3个字符
$
=结束

/^#[0-9a-f]{3,6}$/i
将匹配
#abc
#abcd
#abcde
#abcdef

/^#([0-9a-f]{3}|[0-9a-f]{6})$/i
将匹配
#abc
#abcdef
但不匹配
#abcd

/^#([0-9a-f]{3}){1,2}$/i
/^#(?:[0-9a-f]{3}){1,2}$/i
将匹配
#abc
#abcdef
但不匹配
#abcd

/^#([0-9a-f]{3}){1,2}$/i
/^#(?:[0-9a-f]{3}){1,2}$/i
将匹配
#abc
#abcdef
但不匹配
#abcd

/^#([0-9a-f]{3}){1,2}$/i
/^#(?:[0-9a-f]{3}){1,2}$/i
查看以了解有关javascript中正则表达式的更多信息。

这应该可以
/#[0-9a-f]{6}|#[0-9a-f]{3}/gi

为了在运行中尝试正则表达式并学习它,您可以使用此网站

您可能希望为#RGBA和#RRGGBBAA合并4位和8位十六进制。我在另一个设置中执行此操作,使用
match()
split()
生成数组。我无法让@rodneyrehm发布的所有变体都使用g标志和匹配,但是如果我从高到低顺序列出字符数,第一个(也是最详细的)解决方案是有效的:8、6、4、3

let rx  = /(?:#)[0-9a-f]{8}|(?:#)[0-9a-f]{6}|(?:#)[0-9a-f]{4}|(?:#)[0-9a-f]{3}/ig
let s   = "123 #AA22CC 100% #12F abc #A2Cd #aa11cc44 test 236px";
let arr = s.match(rx); // arr == ["#AA22CC", "#12F", "#A2Cd", "#aa11cc44"]
MDN文档说
(?:#)
应该忘记
“#”
,但事实并非如此,而且
(?=#)
完全失败。我误解了什么?

我的最终目标是在从
match()
返回的数组中包含其他数值。我就快到了……

+1,我正要发布你的最后一个例子。我会切换到非捕获括号
(?:)
。@AndyE非捕获是否会提高性能?或者只是一个美好的拥有@ManseUK:是的,虽然在大多数情况下差异可以忽略不计,但这只是一种“最佳实践”,让你养成在实际需要捕获子表达式时只使用捕获括号的习惯。大写字母也是可以接受的,因此RegExp应该是
/^#(?:[0-9a-fA-F]{3}{1,2}$/i
@xcatliu被i标志覆盖,它使表达式不区分大小写