Javascript Regexp匹配十六进制颜色语法(和缩写形式)
嗯,我对正则表达式非常陌生,尤其是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}=
"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标志覆盖,它使表达式不区分大小写