你如何debugging正则expression式?

正则expression式可能变得相当复杂。 缺乏空白使他们难以阅读。 我不能使用debugging器正常expression式。 那么专家如何debugging复杂的正则expression式呢?

您购买RegexBuddy并使用其内置的debuggingfunction 。 如果你每年使用两次以上的正则expression式,你会立刻把这笔钱还给你。 RegexBuddy还将帮助您创build简单而复杂的正则expression式,甚至以各种语言为您生成代码。

替代文字

另外,根据开发者的说法,这个工具在与WINE一起使用时在Linux上几乎完美无瑕。

在Perl 5.10中, use re 'debug'; 。 (或者debugcolor ,但是我不能在Stack Overflow上正确地格式化输出。)

 $ perl -Mre = debug -e'“foobar”=〜/(。)\ 1 /'
编译REx“(。)\ 1”
最终节目:
    1:OPEN1(3)
    3:REG_ANY(4)
    4:CLOSE1(6)
    6:REF1(8)
    8:结束(0)
 minlen 1
将REx“(。)\ 1”与“foobar”
    0 <> <foobar> |  1:OPEN1(3)
    0 <> <foobar> |  3:REG_ANY(4)
    1 <f> <oobar> |  4:CLOSE1(6)
    1 <f> <oobar> |  6:REF1(8)
                                  失败...
    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)
比赛成功!
释放REx:“(。)\ 1”

此外,您可以添加空白和评论正则expression式,使他们更可读。 在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", ...); 

当我卡在一个正则expression式时,我通常会转向这个: http : //gskinner.com/RegExr/

它非常适合快速testing出现问题的地方。

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

这很好,因为它非常直观: Debuggex正则表达式助手的照片

我使用Kodos – Python正则expression式debugging器:

Kodos是一个Python GUI工具,用于为Python编程语言创build,testing和debugging正则expression式。 Kodos应该帮助任何开发者在Python中高效且轻松地开发正则expression式。 由于Python的正则expression式的实现基于PCRE标准,所以Kodos应该使符合PCRE标准(Perl,PHP等)的其他编程语言的开发人员受益。

(……)

替代文字http://kodos.sourceforge.nethttp://img.dovov.commatch.gif

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

我觉得他们没有。 如果你的正则expression式太复杂,并且有问题,那么你需要一个debugging器,你应该创build一个特定的parsing器,或者使用其他方法。 它会更可读和可维护。

有一个很好的免费工具,正则expression式教练 。 最新版本仅适用于Windows; 其作者Edmund Weitz博士停止维护Linux版本,因为很less有人下载它,但在下载页面上有一个Linux版本。

我用自己的眼睛debugging我的正则expression式。 这就是为什么我使用/x修饰符,为他们写评论,并分成部分。 阅读Jeffrey Friedl的Mastering Regular Expressions来学习如何开发快速和可读的正则expression式。 各种正则expression式debugging工具只是挑起了巫术编程。

我刚刚见过它的创build者:Damian Conway的Regexp :: Debugger的演示文稿。 非常令人印象深刻的东西:运行就地或使用命令行工具(rxrx),交互式或“logging”的执行文件(存储在JSON中),在任何点向前和向后步进,停止在断点或事件,彩色输出(用户可configuration),regexp上的热图和优化的string等等。

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

我使用这个在线工具来debugging我的正则expression式:

http://www.regextester.com/

但是,它不能击败RegexBuddy。

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

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

我用:

http://regexlib.com/RETester.aspx

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

http://regexhero.net/tester/

如果我感觉卡住了,我喜欢倒退,并使用txt2re从示例文本直接生成正则expression式(尽pipe我通常最终会用手来调整结果正则expression式)。

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

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

它是免费的,使用起来很简单,对于我来说,一般来说,正确掌握正则expression式是非常有帮助的。

看看regular-expressions.info上的(非免费) 工具 。 RegexBuddy尤其如此。 杰夫·阿特伍德在这个问题上的post 。

使用像PCREs这样的符号来编写registry项就像编写汇编程序:如果你只能看到相应的有限状态自动机在你脑子里,那很好,但是很难快速维护。

不使用debugging器的原因与不使用编程语言的debugging器相同:您可以修复本地错误,但它们不会帮助您解决导致您在第一个地方出现本地错误的devise问题地点。

更具反思性的方法是使用数据表示在您的编程语言中生成正则expression式,并有适当的抽象来构build它们。 Olin Shiver介绍他的scheme正则expression式给出了devise这些数据表示所面临的问题的极好概述。

我经常使用pcretest – 几乎不是一个“debugging器”,但是它只能处理纯文本的SSH连接,并精确地parsing我需要的正则expression式:我的(C ++)代码链接到libpcre,所以在魔法和什么不是,等等

一般来说,我同意上面的人需要一个正则expression式debugging器是一种代码味道。 对我来说,使用正则expression式最难的通常不是正则expression式本身,而是需要多层引用才能使它们正常工作。

我经常使用基于Ruby的regexptesting器Rubular

并且在Emacs中也使用了Mx 重新构build器

Firefox也有一个有用的扩展

我使用ActiveState Komodo附带的Rx Toolkit。

对于我来说,正则expression式(因为我很stream利,几乎总是使用/ x或等价物)之后,我可能会debugging而不是testing,如果我不确定是否会碰到一些退化的匹配(即过度回溯)看看我能否通过修改操作员的贪婪来解决这些问题。

要做到这一点,我会使用上面提到的方法之一:pcretest,RegexBuddy(如果我目前的工作场所已经授权)或类似的,有时我用Linqpad计时,如果我在C#正则expression式。

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