你如何调试正则表达式?

时间:2010-02-27 19:46:06

标签: regex debugging pcre

正则表达式可能变得非常复杂。缺少空白区域使他们难以阅读。我无法通过调试器使用正则表达式。那么专家如何调试复杂的正则表达式?

21 个答案:

答案 0 :(得分:67)

您购买RegexBuddy并使用其内置的debug feature。如果你一年两次使用正则表达式,你就可以及时将这笔钱及时存起来。 RegexBuddy还将帮助您创建简单和复杂的正则表达式,甚至可以为您生成各种语言的代码。

alt text

另外,根据开发人员的说法,这个工具在Linux when used with WINE上运行得非常完美。

答案 1 :(得分:51)

使用Perl 5.10,use re 'debug';。 (或debugcolor,但我无法在Stack Overflow上正确格式化输出。)

$ 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", ...);

答案 2 :(得分:29)

我会添加另一个,以便我不会忘记它:debuggex

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

答案 3 :(得分:28)

当我陷入正则表达式时,我通常会转向: https://regexr.com/

非常适合快速测试出错的地方。

答案 4 :(得分:18)

我使用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上运行。

答案 5 :(得分:13)

我认为他们没有。如果你的正则表达式过于复杂,而且你需要一个调试器就有问题,你应该创建一个特定的解析器,或者使用另一种方法。它将更具可读性和可维护性。

答案 6 :(得分:11)

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

答案 7 :(得分:8)

我刚看到其创建者:Damian Conway的Regexp :: Debugger演示文稿。 非常令人印象深刻的东西:在原地运行或使用命令行工具(rxrx),交互式运行或在“已记录”的执行文件(存储在JSON中),在任何点前进和后退,在断点或事件上停止,彩色输出(用户可配置) ),regexp上的热图和优化的字符串等......

免费提供给CPAN: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

答案 8 :(得分:7)

我使用这个在线工具来调试我的正则表达式:

http://www.regextester.com/

但是,它无法击败RegexBuddy。

答案 9 :(得分:6)

我亲眼调试我的正则表达式。这就是为什么我使用/x修饰符,为它们写注释并将它们分成几部分。阅读Jeffrey Friedl的 Mastering Regular Expressions ,了解如何开发快速且可读的正则表达式。各种正则表达式调试工具只会激发巫毒编程。

答案 10 :(得分:5)

至于我,我通常使用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
------------------------------------------------------------------

答案 11 :(得分:3)

如果我感觉卡住,我喜欢使用txt2re直接从示例文本生成正则表达式(尽管我通常最终会手动调整生成的正则表达式)。

答案 12 :(得分:3)

如果你是Mac用户,我只是遇到了这个:

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

它是免费的,而且使用简单,对我来说,掌握RegExs一般都是很有帮助的。

答案 13 :(得分:3)

我用:

http://regexlib.com/RETester.aspx

你也可以试试Regex Hero(使用Silverlight):

http://regexhero.net/tester/

答案 14 :(得分:2)

我经常使用pcretest - 几乎不是“调试器”,但它适用于纯文本的SSH连接,并且完全解析我需要的正则表达式方法:我的(C ++)代码链接到libpcre,所以在什么是微妙的差异是没有困难的魔法,什么不是,等等。

总的来说,我同意上面那个需要正则表达式调试器的代码气味的人。对我来说,使用正则表达式最难的通常不是正则表达式本身,而是需要多层引用才能使它们起作用。

答案 15 :(得分:2)

我经常使用基于Ruby的regexp测试器Rubular

并且在Emacs中也使用 M-x re-builder

Firefox也有useful extension

答案 16 :(得分:2)

我使用ActiveState Komodo附带的Rx工具包。

答案 17 :(得分:2)

使用类似PCRE的符号编写注册表就像编写汇编程序一样:如果你能在头脑中看到相应的有限状态自动机,那就没问题了,但很难很快维护它。

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

更具反射性的方法是使用数据表示法在编程语言中生成正则表达式,并使用适当的抽象来构建它们。 Olin Shiver's introduction to his scheme regexp notation概述了设计这些数据表示时遇到的问题。

答案 18 :(得分:2)

答案 19 :(得分:1)

答案 20 :(得分:0)

对我来说,在对正则表达式进行了眼睛处理(因为我相当流利,并且几乎总是使用/ x或等效),我可能会调试而不是测试我是否不确定是否会遇到一些简并匹配(即过度回溯)看看我是否可以通过修改操作员的贪婪来解决这些问题。

要做到这一点,我会使用上面提到的方法之一:pcretest,RegexBuddy(如果我目前的工作场所已获得许可)或类似方法,如果我在C#regexes工作,有时我会在Linqpad中计时。< / p>

(perl技巧对我来说是一个新技巧,所以也可能将它添加到我的正则表达式工具包中。)