我正在观看有关regular expressions的讲座当时14:52她编写了正则表达式来匹配十六进制代码,例如
#abc
#f00
#BADA55
#C0FFEE
所以基本上语法是 -:
- 以#号开头
- 以下字母的范围可以是 [a-fA-F0-9]。
- 这些字母的大小应恰好为 3 或 6。
我明白了答案
/^#([A-Fa-f\d]{3}){1,2}$/g
但是我的正则表达式使用组捕获有什么问题-:
/^#(([A-Fa-f\d]){3}|\2{6})$/
或
/^#(([A-Fa-f\d]{3})|\2{2})$/
但是
/^#(([A-Fa-f\d]{3})|[A-Fa-f\d]{6})$/
正在工作
我正在使用this用于测试我的正则表达式。 提前致谢
最佳答案
您正在使用交替;您不能在一个分支中引用在另一分支中捕获的变量。更深入一点,关于你的第一个失败的例子:
/^#(([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
有效。
关于regex - 对捕获组并进一步使用它们感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41757396/