gpt4 book ai didi

regex - 如何阅读 perl 正则表达式调试器

转载 作者:行者123 更新时间:2023-12-02 08:29:11 25 4
gpt4 key购买 nike

我遇到了以下 Material :

  • Mastering Perlbrian d foy , 章节:调试正则表达式。
  • Debugging regular expressions其中提到 re::debug perl 模块

  • 我还尝试使用其他各种技术:
  • Module re=debugcolor这突出了它的输出。
  • Used以下施工?{print "$1 $2\n"} .

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

    编辑 回复鲍罗丁:

    第一个例子:
    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"
  • 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"
  • 在这个例子中,为什么数字是递减 6 5 4 3 ...?
  • 失败的关键字是什么意思?
  • 最佳答案

    正则表达式定义有限状态机1。调试器或多或少地向您展示状态机在逐个字符地使用字符串时是如何进行的。

    “编译 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_ANY )。唯一可能发生的其他事情是输入结束。我这里没有画。 REG_ANY指令包含在捕获组指令中。 OPEN1开始将所有匹配的字符记录到第一个捕获组中。 CLOSE1停止将字符记录到第一个捕获组。

    一旦我们消费了一个角色,我们就坐在 State 1并消耗下一个字符。如果它与前一个字符匹配,我们就成功了! REF1是尝试匹配捕获组 #1 的指令。否则,我们失败了,需要回到 Start再试一次。每当匹配器说“失败...”时,它就会告诉您某些事情不起作用,因此它会返回到较早的状态(可能包含也可能不包含“不消耗”字符)。
    * 的示例更复杂。 * (对应于 STAR )尝试匹配给定模式零次或多次,并且它是贪婪的。这意味着它会尝试匹配尽可能多的字符。从字符串的开头开始,它说“我最多可以匹配 6 个字符!”因此,它匹配所有 6 个字符( "foobar" ),关闭捕获组,并尝试匹配 "foobar"再次。那是行不通的!它再次尝试 5,但不起作用。依此类推,直到它尝试匹配零个字符。这意味着捕获组为空,匹配空字符串总是成功。所以匹配成功 \1 = "" .

    我意识到与 Perl 的正则表达式调试器相比,我花在解释正则表达式上的时间更多。但是我认为,一旦您了解了正则表达式的运作方式,它的输出就会变得更加清晰。

    这是 finite state machine simulator .您可以输入一个正则表达式并查看它的执行情况。不幸的是,它不支持反向引用。

    1:我相信 Perl 的一些正则表达式特性使它超出了这个定义,但以这种方式考虑它们仍然很有用。

    关于regex - 如何阅读 perl 正则表达式调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29167421/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com