如何调试正则表达式?

正则表达式可能变得非常复杂。留白的缺乏使它们难以阅读。我不能使用调试器单步执行正则表达式。那么专家如何调试复杂的正则表达式呢?

39113 次浏览

你购买 RegexBuddy和使用它的内置在 调试功能。如果您每年使用正则表达式超过两次,您将在节省的时间内及时赚回这笔钱。RegexBuddy 还可以帮助您创建简单和复杂的正则表达式,甚至可以用多种语言为您生成代码。

alt text

而且,根据开发人员的说法,这个工具在 与 WINE 一起使用时的 Linux上运行得几乎完美无瑕。

我觉得他们没有。如果 regexp 过于复杂,并且问题严重到需要调试器的地步,则应创建特定的解析器,或使用其他方法。它将更具可读性和可维护性。

使用 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"

此外,可以还为正则表达式添加了空格和注释,使其更具可读性。在佩尔,这是用 abc0修饰符完成的。有了 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", ...);

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

Https://www.regextester.com/

但没错,它不能打败 RegexBuddy。

我亲眼调试我的正则表达式。这就是为什么我使用 /x修饰语,为它们写注释,并将它们分成几部分。阅读 Jeffrey Friedl 的 管理正则表达式来学习如何开发快速且可读的正则表达式。各种正则表达式调试工具只会引发巫术编程。

有一个很好的免费工具,正方形教练。最新版本只适用于 Windows; 其作者 Edmund Weitz 博士停止维护 Linux 版本,因为下载它的人太少,但在下载页面上有一个更旧的 Linux 版本。

使用像 PCRE 这样的符号编写 reg ex 就像编写汇编程序一样: 如果您只能在头脑中看到相应的有限状态自动机就可以了,但是很难很快地维护它。

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

更具反射性的方法是使用数据表示在编程语言中生成 regexp,并使用适当的抽象来构建它们。Olin Shiver 对他的方案 regexp 表示法的介绍对设计这些数据表示形式所面临的问题给出了极好的概述。

我用:

Http://regexlib.com/retester.aspx

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

Http://regexhero.net/tester/

我使用 寇多斯-Python 正则表达式调试器:

Kodos 是一个用于为 Python 创建、测试和调试正则表达式的 Python GUI 实用工具。Kodos 应该有助于任何开发人员高效、轻松地用 Python 开发正则表达式。因为 Python 正则表达式的实现是基于 PCRE标准的,所以 Kodos 应该有利于其他遵循 PCRE 标准(Perl、 PHP 等)的编程语言的开发人员。.).

(...)

alt text

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

当我在正则表达式上遇到困难时,我通常会求助于以下方法: Https://regexr.com/

它非常适合快速测试哪里出了问题。

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

我经常使用 pcretest ——几乎不是一个“调试器”,但它只能在文本 SSH 连接上工作,并能精确地解析我所需要的正则方言: 我的(C + +)代码链接到 libpcre,所以在什么是魔术和什么不是魔术方面没有任何困难。

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

我经常使用基于 Ruby 的 regexp 测试程序 粗鲁

在 Emacs 中也使用 M-x 重建者

Firefox 也有一个 有用的扩展

我使用 激活状态科莫多中包含的 Rx 工具包。

如果你是 Mac 用户,我刚刚发现了这个:

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

它是免费的,使用起来也很简单,而且它对我了解一般的正则表达式有很大的帮助。

对我来说,我通常使用 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
------------------------------------------------------------------

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

CPAN 免费提供: Http://search.cpan.org/~dconway/regexp-debugger/lib/regexp/debugger.pm

对我来说,在目测了正则表达式(因为我相当流利,几乎总是使用/x 或等价)之后,我可能会调试而不是测试,如果我不确定我是否会碰到一些退化匹配(例如,过度回溯的东西) ,看看我是否可以通过修改操作符的贪婪性来解决这些问题,例如。

为了做到这一点,我会使用上面提到的方法之一: pcretest、 RegexBuddy (如果我目前的工作场所已经授权使用它)或类似的方法,有时候如果我使用的是 c # 正则表达式,我会在 Linqpad 计时。

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

我再加一个,这样我就不会忘记了: 调试程序

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