我正在观看关于regular expressions的讲座,当时14:52她写了正则表达式以匹配十六进制代码,例如
#abc
#F00
#BADA55
#C0FFEE
基本上语法是 - :
我理解答案
/ ^#([A-发-F \ d] {3}){1,2} $ /克
但是我的正则表达式使用群组捕获有什么问题 - :
/ ^#(([A-发-F \ d]){3} | \ 2 {6})$ /
或
/ ^#(([A-发-F \ d] {3})| \ 2 {2})$ /
但是
/ ^#(([A-发-F \ d] {3})| [A-发-F \ d] {6})$ /
正在运作
我正在使用this来测试我的正则表达式。 提前致谢
答案 0 :(得分:3)
您正在使用轮换;您无法在一个分支中引用您在另一个分支中捕获的变量。在你的第一个失败的例子中更深入一点:
/^#(([A-Fa-f\d]){3}|\2{6})$/
这里有两个概念错误。
[A-Fa-f\d]
是任何十六进制数字;
([A-Fa-f\d])
将捕获 a 十六进制数字;
([A-Fa-f\d]){3}
是三位十六进制数字,其中一个将被捕获(通常是最后一个)。
如果您以后使用\2
,那将是一个捕获的数字,而不是"任何十六进制数字"的正则表达式代码。
更深层次的问题是:为了捕获数字,交替的左侧必须成功。交替的要点是你评估左侧或右侧;如果左边的一个成功,则不检查右侧!另一方面,如果你没有匹配左侧,右侧也会失败,因为\2
未定义!
编辑:另请注意,#COFFEE
无效,但#C0FFEE
是。