regex - 对捕获组并进一步使用它们感到困惑

标签 regex

我正在观看有关regular expressions的讲座当时14:52她编写了正则表达式来匹配十六进制代码,例如

#abc

#f00

#BADA55

#C0FFEE

所以基本上语法是 -:

  1. 以#号开头
  2. 以下字母的范围可以是 [a-fA-F0-9]。
  3. 这些字母的大小应恰好为 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})$/

这里有两个概念错误。

  1. [A-Fa-f\d]任意十六进制数字;

    1. ([A-Fa-f\d]) 将捕获a 十六进制数字;

    2. ([A-Fa-f\d]){3} 是三个十六进制数字,其中一个将被捕获(通常是最后一个数字) )。

    3. 如果您稍后使用 \2,它将是捕获的数字,而不是“任何十六进制数字”的正则表达式代码。

  2. 更深层次的问题是:为了捕获数字,交替的左侧必须成功。交替的要点是您评估左侧或右侧;如果左边成功了,右边就不检查了!另一方面,如果左侧匹配失败,右侧也会失败,因为 \2 未定义!

编辑:另请注意,#COFFEE 无效,但 #C0FFEE 有效。

关于regex - 对捕获组并进一步使用它们感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41757396/

相关文章:

javascript - 在每 "n"个字符添加空格后,如果第一个字符为零则不计数

regex - 如何仅删除单个空行 - 保留多个空行

javascript - js正则表达式从包含星号的字符串中提取字符串

java - 正则表达式匹配特殊字符除了连字符与数字混合

javascript - 调试 Javascript 中的正则表达式

python - 缓存磁盘操作

php - 正则表达式:删除字符串末尾的数字和特定字符串后的文本

c# - 与 .NET 正则表达式的乘法

python - 基于 Python 中的几个正则表达式规则进行替换

用于识别包含在三引号中的有效 Python 字符串的 Javascript flavor 正则表达式