正则表达式可能变得非常复杂。缺少空白区域使他们难以阅读。我无法通过调试器使用正则表达式。那么专家如何调试复杂的正则表达式?
答案 0 :(得分:67)
您购买RegexBuddy并使用其内置的debug feature。如果你一年两次使用正则表达式,你就可以及时将这笔钱及时存起来。 RegexBuddy还将帮助您创建简单和复杂的正则表达式,甚至可以为您生成各种语言的代码。
另外,根据开发人员的说法,这个工具在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
它很好,因为它非常直观:
答案 3 :(得分:28)
当我陷入正则表达式时,我通常会转向: https://regexr.com/
非常适合快速测试出错的地方。
答案 4 :(得分:18)
我使用Kodos - Python正则表达式调试器:
Kodos是一个Python GUI实用程序,用于为Python编程语言创建,测试和调试正则表达式。 Kodos应该帮助任何开发人员高效,轻松地在Python中开发正则表达式。由于Python的正则表达式实现基于PCRE标准,因此Kodos应该使其他编程语言的开发人员受益,这些编程语言也遵循PCRE标准(Perl,PHP等)。
(...)
在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)
答案 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)
答案 14 :(得分:2)
我经常使用pcretest - 几乎不是“调试器”,但它适用于纯文本的SSH连接,并且完全解析我需要的正则表达式方法:我的(C ++)代码链接到libpcre,所以在什么是微妙的差异是没有困难的魔法,什么不是,等等。
总的来说,我同意上面那个需要正则表达式调试器的代码气味的人。对我来说,使用正则表达式最难的通常不是正则表达式本身,而是需要多层引用才能使它们起作用。
答案 15 :(得分:2)
答案 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技巧对我来说是一个新技巧,所以也可能将它添加到我的正则表达式工具包中。)