困惑于捕获群组并进一步使用它们

时间:2017-01-20 06:28:55

标签: regex

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

  

#abc

     

#F00

     

#BADA55

     

#C0FFEE

基本上语法是 - :

  1. 以#sign
  2. 开头
  3. 以下字母可以是[a-fA-F0-9]。
  4. 的范围
  5. 这些字母应该是3或6的大小。
  6. 我理解答案

      

    / ^#([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来测试我的正则表达式。 提前致谢

1 个答案:

答案 0 :(得分:3)

您正在使用轮换;您无法在一个分支中引用您在另一个分支中捕获的变量。在你的第一个失败的例子中更深入一点:

/^#(([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未定义!

  3. 编辑:另请注意,#COFFEE无效,但#C0FFEE是。