Regex 如何读取perl正则表达式调试器

Regex 如何读取perl正则表达式调试器,regex,perl,debugging,Regex,Perl,Debugging,我遇到了以下材料: 由,第章:调试正则表达式 其中提到了perl的re::debug模块 我还尝试使用各种其他技术: re=debugcolor突出显示其输出 以下构造?{print“$1$2\n”} 但仍然没有弄明白如何读取它们的输出。我还发现了另一个用于调试正则表达式的模块,但我还没有尝试过它们,您能解释一下如何读取use re'debug'或另一个用于在perl中调试正则表达式的命令的输出吗 编辑回复Borodin: 第一个例子: perl -Mre=debug -e' "foobar"=

我遇到了以下材料:

  • 由,第章:调试正则表达式
  • 其中提到了perl的
    re::debug
    模块
  • 我还尝试使用各种其他技术:

  • re=debugcolor
    突出显示其输出

  • 以下构造
    ?{print“$1$2\n”}

  • 但仍然没有弄明白如何读取它们的输出。我还发现了另一个用于调试正则表达式的模块,但我还没有尝试过它们,您能解释一下如何读取
    use re'debug'
    或另一个用于在perl中调试正则表达式的命令的输出吗

    编辑回复Borodin:

    第一个例子:

    perl -Mre=debug -e' "foobar"=~/(.)\1/'
    Compiling REx "(.)\1"
    Final program:
       1: OPEN1 (3)
       3:   REG_ANY (4)
       4: CLOSE1 (6)
       6: REF1 (8)
       8: END (0)
    minlen 1
    Matching REx "(.)\1" against "foobar"
       0 <> <foobar>             |  1:OPEN1(3)
       0 <> <foobar>             |  3:REG_ANY(4)
       1 <f> <oobar>             |  4:CLOSE1(6)
       1 <f> <oobar>             |  6:REF1(8)
                                      failed...
       1 <f> <oobar>             |  1:OPEN1(3)
       1 <f> <oobar>             |  3:REG_ANY(4)
       2 <fo> <obar>             |  4:CLOSE1(6)
       2 <fo> <obar>             |  6:REF1(8)
       3 <foo> <bar>             |  8:END(0)
    Match successful!
    Freeing REx: "(.)\1"
    
    perl-Mre=debug-e''foobar=~/()\1/'
    正在编译REx“()\1”
    最终课程:
    1:OPEN1(3)
    3:REG_ANY(4)
    4:关闭1(6)
    6:参考文献1(8)
    8:完(0)
    明伦1
    将REx“()\1”与“foobar”匹配
    0 | 1:OPEN1(3)
    0 | 3:REG|U ANY(4)
    1 | 4:CLOSE1(6)
    1 | 6:参考文献1(8)
    失败。。。
    1 | 1:OPEN1(3)
    1 | 3:REG|U ANY(4)
    2 | 4:关闭1(6)
    2 | 6:参考文献1(8)
    3 | 8:结束(0)
    比赛成功!
    释放REx:“()\1”
    
  • OPEN1、REG_ANY和CLOSE1都有什么功能。。。什么意思
  • 像1 3 4 6 8这样的数字意味着什么
  • 大括号中的数字OPEN1(3)是什么意思
  • 我应该查看哪个输出,编译REx还是匹配REx
  • 第二个例子:

     perl -Mre=debugcolor -e' "foobar"=~/(.*)\1/'
    Compiling REx "(.*)\1"
    Final program:
       1: OPEN1 (3)
       3:   STAR (5)
       4:     REG_ANY (0)
       5: CLOSE1 (7)
       7: REF1 (9)
       9: END (0)
    minlen 0
    Matching REx "(.*)\1" against "foobar"
       0 <foobar>|  1:OPEN1(3)
       0 <foobar>|  3:STAR(5)
                                      REG_ANY can match 6 times out of 2147483647...
       6 <foobar>|  5:  CLOSE1(7)
       6 <foobar>|  7:  REF1(9)
                                        failed...
       5 <foobar>|  5:  CLOSE1(7)
       5 <foobar>|  7:  REF1(9)
                                        failed...
       4 <foobar>|  5:  CLOSE1(7)
       4 <foobar>|  7:  REF1(9)
                                        failed...
       3 <foobar>|  5:  CLOSE1(7)
       3 <foobar>|  7:  REF1(9)
                                        failed...
       2 <foobar>|  5:  CLOSE1(7)
       2 <foobar>|  7:  REF1(9)
                                        failed...
       1 <foobar>|  5:  CLOSE1(7)
       1 <foobar>|  7:  REF1(9)
                                        failed...
       0 <foobar>|  5:  CLOSE1(7)
       0 <foobar>|  7:  REF1(9)
       0 <foobar>|  9:  END(0)
    Match successful!
    Freeing REx: "(.*)\1"
    
    perl-Mre=debugcolor-e'“foobar”=~/(.*)\1/'
    正在编译REx“(.*)\1”
    最终课程:
    1:OPEN1(3)
    3:星(5)
    4:REG_ANY(0)
    5:1(7)
    7:参考文献1(9)
    9:完(0)
    米伦0
    将REx“(.*)\1”与“foobar”匹配
    0 | 1:OPEN1(3)
    0 | 3:星(5)
    REG_ANY可以匹配2147483647中的6次。。。
    6 | 5:关闭1(7)
    6 | 7:参考文献1(9)
    失败。。。
    5 | 5:CLOSE1(7)
    5 | 7:参考文献1(9)
    失败。。。
    4 | 5:CLOSE1(7)
    4 | 7:参考文献1(9)
    失败。。。
    3 | 5:CLOSE1(7)
    3 | 7:参考文献1(9)
    失败。。。
    2 | 5:关闭1(7)
    2 | 7:参考文献1(9)
    失败。。。
    1 | 5:CLOSE1(7)
    1 | 7:参考文献1(9)
    失败。。。
    0 | 5:关闭1(7)
    0 | 7:参考文献1(9)
    0 | 9:结束(0)
    比赛成功!
    释放REx:(.*)\1
    
  • 为什么数字在下降6 5 4 3。。。在这个例子中
  • 失败的关键字是什么意思

  • 调试信息包含字节码的描述。数字表示op树中的节点索引。圆括号中的数字告诉引擎在匹配时跳转到特定节点。精确运算符告诉正则表达式引擎查找文本字符串。REG_表示.symbol。加号表示+。代码0用于“结束”节点。OPEN1是一个“(”符号.CLOSE1表示“)”。星是一个“*”。当匹配器到达end节点时,它将成功代码返回给Perl,表明整个正则表达式已匹配


    有关详细信息,请参阅和更具概念性的

    正则表达式定义有限状态机1。调试器或多或少地向您展示了当字符串被逐个字符使用时状态机的运行情况

    “Compiling REx”是该正则表达式的指令列表。每个指令后括号中的数字是步骤成功后的去向。在
    /(.*)\1/
    中:

    1: OPEN1 (3)
    3:   STAR (5)
    4:     REG_ANY (0)
    5: CLOSE1 (7)
    
    STAR(5)
    表示计算
    STAR
    ,一旦成功,请转至说明5
    CLOSE1

    “匹配REx”是这些指令的逐步执行。左边的数字是到目前为止已使用的字符总数。如果匹配器由于尝试的某项功能不起作用而不得不后退,则该数字可能会下降

    要理解这些指令,重要的是要理解正则表达式如何“工作”。有限状态机通常被可视化为一种流程图。我在下面为
    /()\1/
    制作了一个粗糙的。由于对捕获组的反向引用,我不相信这个正则表达式是严格的有限状态机。这张图表仍然有用

                   Match                           
    +-------+     Anything     +----------+        
    | Start +------------------+  State 1 |        
    +---^---+                  +--+---+---+        
        |                         |   |            
        |                         |   |Matched same
        +-------------------------+   | character  
                matched different     |            
                    character    +----+------+     
                                 |  Success  |     
                                 +-----------+   
    
    我们从
    start
    开始。进入第一个状态很容易,我们只需使用任意一个字符(
    REG\u any
    )。唯一可能发生的另一件事是输入结束。我没有在这里画。
    REG\u ANY
    指令包装在捕获组指令中
    OPEN1
    开始将所有匹配的字符记录到第一个捕获组中<代码>关闭1停止将字符记录到第一个捕获组

    一旦我们使用了一个字符,我们就坐在状态1上并使用下一个字符。如果它与前一个字符匹配,我们将走向成功
    REF1
    是尝试匹配捕获组#1的指令。否则,我们将失败,需要返回
    开始
    重试。每当匹配器说“失败…”时,它会告诉您某些内容不起作用,因此它会返回到较早的状态(可能包括也可能不包括“未使用”字符)

    带有
    *
    的示例更复杂
    *
    (对应于
    星型
    )尝试零次或多次匹配给定的模式,这是贪婪的。这意味着它会尽可能多地匹配字符。从字符串开头开始,它说“我最多可以匹配6个字符!”因此,它匹配所有6个字符(
    “foobar”
    ),关闭捕获组,并再次尝试匹配
    “foobar”
    )。那不行!它用5再试一次,但不起作用。依此类推,直到它尝试匹配零个字符。那