你如何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
这很好,因为它非常直观:
我使用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
至于我,我通常使用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 ------------------------------------------------------------------
如果我感觉卡住了,我喜欢倒退,并使用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式工具包中。)