代码之家  ›  专栏  ›  技术社区  ›  rook

如何调试正则表达式?[关闭]

  •  143
  • rook  · 技术社区  · 14 年前

    正则表达式可能变得相当复杂。空白的地方使他们很难阅读。我不能用调试器遍历正则表达式。那么专家如何调试复杂的正则表达式呢?

    21 回复  |  直到 6 年前
        1
  •  67
  •   Community rohancragg    7 年前

    你买 RegexBuddy 使用它内置的 debug feature . 如果你一年和regex一起工作两次以上,你很快就能赚回这笔钱。regexbuddy还将帮助您创建简单而复杂的正则表达式,甚至可以用多种语言为您生成代码。

    alt text

    另外,据开发人员说,这个工具在 Linux when used with WINE

        2
  •  51
  •   ephemient    14 年前

    使用Perl5.10, use re 'debug'; . (或) debugcolor ,但在堆栈溢出时无法正确格式化输出。)

    $ 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中,这是通过 /x 修饰语。用 pcre ,这是 PCRE_EXTENDED 旗帜。

    "foobar" =~ /
        (.)  # any character, followed by a
        \1   # repeat of previously matched character
    /x;
    
    pcre *pat = pcre_compile("(.)  # any character, followed by a\n"
                             "\\1  # repeat of previously matched character\n",
                             PCRE_EXTENDED,
                             ...);
    pcre_exec(pat, NULL, "foobar", ...);
    
        3
  •  29
  •   Sergiu Toarca    11 年前

    我再加一个以免忘记: debuggex

    很好,因为它非常直观: Photo of the Debuggex regex helper

        4
  •  28
  •   trogper    6 年前

    当我被一个正则表达式卡住时,我通常会这样说: https://regexr.com/

    它非常适合快速检测出问题的地方。

        5
  •  18
  •   Pascal Thivent    14 年前

    我用 Kodos -python正则表达式调试器:

    kodos是一个python gui实用程序,用于为python编程语言创建、测试和调试正则表达式。kodos应该帮助任何开发人员在python中高效、轻松地开发正则表达式。因为python的正则表达式实现基于 PCRE 标准的,kodos应该有利于其他编程语言的开发人员,这些语言也遵循pcre标准(perl、php等)。

    (…)

    alt text http://kodos.sourceforge.net/images/match.gif

    在Linux、Unix、Windows、Mac上运行。

        6
  •  13
  •   Amal Murali    10 年前

    我认为没有。如果你的regexp太复杂,并且有问题到需要调试器的地步,你应该创建一个特定的解析器,或者使用另一个方法。它将更具可读性和可维护性。

        7
  •  11
  •   APC    14 年前

    有一个很好的免费工具, the Regex Coach . 最新版本仅适用于Windows;其作者Edmund Weitz博士停止维护Linux版本,因为下载它的人太少,但在下载页面上有一个旧版本的Linux。

        8
  •  8
  •   Yves    12 年前

    我刚刚看到了regexp::debugger的创建者damian conway的演示。 非常令人印象深刻的东西:运行在原地或使用命令行工具(rxrx),以交互方式或在一个“记录”的执行文件(存储在json中),在任何点向前或向后跨一步,在断点或事件上停止,彩色输出(用户可配置),regexp上的热图和优化字符串,等等……

    可在CPAN上免费获得: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

        9
  •  7
  •   janot    10 年前

    我使用此联机工具调试正则表达式:

    http://www.regextester.com/

    但是,是的,它不能打败雷格斯巴迪。

        10
  •  6
  •   HEDMON    6 年前

    我用自己的眼睛调试正则表达式。所以我用 /x 修饰符,为它们写注释并将它们分成几个部分。读杰弗里德的 Mastering Regular Expressions 学习如何开发快速且可读的正则表达式。各种regex调试工具只会激发伏都教编程。

        11
  •  5
  •   dark100    13 年前

    至于我,我通常使用pcretest实用程序,它可以转储任何正则表达式的字节码,而且通常更容易阅读(至少对我来说)。例子:

    PCRE version 8.30-PT1 2012-01-01
    
      re> /ab|c[de]/iB
    ------------------------------------------------------------------
      0   7 Bra
      3  /i ab
      7  38 Alt
     10  /i c
     12     [DEde]
     45  45 Ket
     48     End
    ------------------------------------------------------------------
    
        12
  •  3
  •   Leniel Maccaferri    14 年前

    我使用:

    http://regexlib.com/RETester.aspx

    您也可以尝试regex英雄(使用silverlight):

    http://regexhero.net/tester/

        13
  •  3
  •   eggsyntax    14 年前

    如果我觉得卡住了,我喜欢使用 txt2re (尽管我通常会手工调整得到的正则表达式)。

        14
  •  3
  •   jayp    13 年前

    如果你是一个Mac用户,我刚刚遇到一个:

    http://atastypixel.com/blog/reginald-regex-explorer/

    它是免费的,使用起来很简单,它对我掌握regex有很大的帮助。

        15
  •  2
  •   Skilldrick    14 年前
        16
  •  2
  •   Charles Stewart    14 年前

    使用pcres这样的符号编写reg-exe就像编写汇编程序:如果你能在头脑中看到相应的有限状态自动机,那就没问题了,但是很快就很难维护。

    不使用调试器的原因与不使用带有编程语言的调试器的原因大致相同:您可以修复本地错误,但它们不会帮助您解决导致您首先出现本地错误的设计问题。

    更具反射性的方法是使用数据表示在编程语言中生成regexp,并有适当的抽象来构建它们。 Olin Shiver's introduction to his scheme regexp notation 对设计这些数据表示所面临的问题进行了极好的概述。

        17
  •  2
  •   Bernd Jendrissek    14 年前

    我经常使用pCyTest--几乎没有一个“调试器”,但它只适用于文本SSH连接,并解析我需要的正则表达式:我的(C++)代码链接到LIPPCRE,所以在什么是魔术和什么不是什么细微差别方面没有困难。

    总的来说,我同意上面提到的那个人,他需要一个regex调试器是一种代码味道。对我来说,使用正则表达式最困难的通常不是正则表达式本身,而是使它们工作所需的多个引用层。

        18
  •  2
  •   ocodo    14 年前

    我经常使用基于ruby的regexp测试程序 Rubular

    以及在emacs中的使用 M—X re-builder

    Firefox还有一个 useful extension

        19
  •  2
  •   Czechnology    13 年前

    我使用RX工具包 ActiveState Komodo .

        20
  •  1
  •   Eugeniu Torica    14 年前
        21
  •  0
  •   ChrisF    11 年前

    对我来说,在看了regex之后(因为我相当流利,而且几乎总是使用/x或类似的代码),如果我不确定我是否会进行一些退化匹配(即过度回溯的东西),我可能会调试而不是测试,看是否可以通过修改greedyness来解决这些问题。例如运算符。

    为此,我会使用上面提到的方法之一:pcretest、regexbuddy(如果我当前的工作场所有许可证)或类似的方法,如果我在c regexes工作,有时我会在linqpad中计时。

    (Perl技巧对我来说是一个新的技巧,因此可能也会将其添加到我的regex工具包中。)