你如何调试正则表达式?

156

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


2
我认为“测试”你的正则表达式比“调试”它更重要。通常情况下,通过查看结果(或使用答案中建议的工具之一)就可以很容易地了解到正则表达式的运行情况,但是为了确保它确实实现了你的意图,你应该使用所有可能的边界情况来测试你的正则表达式。测试最终将澄清你真正想要做什么,并使调试变得无用 :) - baol
7
看起来很有趣:http://www.debuggex.com/。(由于问题已关闭,我不能提供真正的答案。) - KajMagnus
如果您有Visual Studio,可以在问题区域附近(例如:RegEx.Replace(...))设置断点,切换到“立即窗口”并尝试一些'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)命令,以快速定位问题。 - DeepSpace101
2
我非常惊讶,似乎没有人提到 https://regex101.com/,它具有实际的调试器,并且也是 Web 托管的。 - mechalynx
1
即使在2017年,我仍然相信RegexBuddy是我能找到的最好的工具,而且价格仍然是40美元。我经常使用不同的语言和不同的正则表达式风格进行工作,所以我经常感到困惑。有了RegexBuddy,它只是让我从语法中解脱出来。 - code4j
尝试使用CodVerter正则表达式测试器:https://codverter.com/src/regextester 在线正则表达式测试器,用于验证正则表达式模式。编辑器在输入时进行更新,并且可以根据需要更改标志。工作可以保存在本地或云端。 - Jonathan Applebaum
21个回答

71
您购买RegexBuddy并使用其内置的调试功能。如果您每年使用正则表达式超过两次,您将在省时间方面很快收回这些费用。RegexBuddy还将帮助您创建简单和复杂的正则表达式,并甚至为您生成多种语言的代码。

alt text

此外,据开发人员介绍,在与WINE一起使用时,该工具在Linux上几乎无故障运行


33
很遗憾,它只支持Windows系统,并且需要支付40美元的费用。 - kennytm
26
根据开发者的说法,它可以通过WINE在Linux上运行:http://www.regexbuddy.com/wine.html。至于40美元的费用……你觉得你的时间值多少钱? - Mick
19
这不是免费软件。 - codeholic
39
谁说了这话或者谁要求了它? - Tim Pietzcker
21
就像米克说的那样,你的时间值多少钱?“用钱买到的最好工具”不一定总是需要花费金钱,但有时确实需要。此外,JGSoft始终开发出质量非常高、用户服务卓越的产品。我甚至购买了我并不真正需要的软件(如RegexMagic),因为我想支持他们并让他们继续经营下去。你不知道你错过了什么。说真的。 - Tim Pietzcker
显示剩余10条评论

53

使用 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: END (0)
minlen 1
对 "foobar" 进行匹配 "(.)\1"
   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"

此外,您可以在正则表达式中添加空格和注释以使其更易读。 在 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", ...);

13
为什么有人会更喜欢RegexBuddy而不是这个呢? - Charles Stewart
1
我喜欢这种方法,虽然我认为正则表达式助手更好。 - rook
echo "foobar" | egrep "(.)\1" - DmitrySandalov

30
我会再添加一个,以免忘记它: debuggex 这个工具很好用,因为非常直观: Photo of the Debuggex regex helper

debuggex 实际上对我不起作用:字体是由 JavaScript 强制执行的,显然无法正常工作(我有等宽字体,火狐控制台可以完美地使用它们)。因此,该显示是无法使用的。另外,JavaScript 测试会在很多测试用例下挂起浏览器,每次进行编辑时都会出现(而不仅仅是一次)。最后,部分提议的正则表达式存在错误,不能按预期匹配。 - 7heo.tk

30

当我遇到正则表达式的问题时,我通常会去使用这个工具:

https://regexr.com/

这个工具非常适合快速测试出哪里出了问题。


2
这个工具真的很有用:它是基于Web托管的,所以不需要安装,它是实时的,所以调试起来非常方便,甚至还有有用的工具提示和特殊字符列表,万一您忘记了某些东西。它非常完美,非常感谢。 - Jason Ridge
不幸的是,这个工具仍然不允许您更改正则表达式定界符(即使对于PCRE引擎) - 它们被固定为“/”(斜杠)。这对我来说是一个致命问题。 - MrWhite

19

我使用Kodos - Python正则表达式调试器:

Kodos是一个Python GUI实用程序,用于创建、测试和调试Python编程语言的正则表达式。Kodos应该能够帮助任何开发人员高效轻松地开发Python中的正则表达式。由于Python对正则表达式的实现基于PCRE标准,因此Kodos也应该有益于遵循PCRE标准的其他编程语言的开发人员(如Perl、PHP等)。

(...)

alt text

可在Linux、Unix、Windows、Mac上运行。


2
Kodos 并不提供真正的调试功能。你不能逐步执行正则表达式,也无法暂停执行。 - candide
有关在 Mac 上使其运行的任何提示吗? Sourceforge 网站上没有提供有关 Mac 安装的任何信息,而我的 Google 搜索似乎失败了。 - Adam Parkin
尽管看起来这似乎是Python 2,但自2006年以来(在撰写本文时已有14年),它并没有更新过? - MrWhite

13

我认为不需要。如果你的正则表达式太复杂,且出现问题以至于需要使用调试器,那么你应该创建一个特定的解析器或使用其他方法。这会使代码更易读和可维护。


4
你是在看了regexbuddy的截图之后才发帖的吗? - rook
2
每个人都会对此持不同意见,但这并不是一个坏主意。每个人都认为正则表达式引擎在处理巨大的正则表达式时最有效。这并不一定正确,而且它们绝对不容易阅读。将你的正则表达式分解成小块。 - Dan Rosenstark
1
@Michael Brooks:不,实际上是在之前。看了截图后,我对于你可以调试正则表达式这一事实感到满意。但是我仍然坚持我的想法:当正则表达式变得过于复杂时,就是换用其他方法的时候了。 - Valentin Rocher

12

有一个非常好用的免费工具,Regex Coach。最新版本只适用于Windows系统,作者Edmund Weitz博士停止了Linux版本的维护,因为下载量太少,但是在下载页面上可以找到旧版本的Linux版。


9
我刚刚看到了Regexp::Debugger的展示,由它的创作者Damian Conway进行。令人印象深刻的是:可以在原地运行或使用命令行工具(rxrx),交互式地或在“记录”执行文件(以JSON格式存储)上运行,随时向前和向后调试,停在断点或事件上,输出有颜色(可由用户配置),正则表达式和字符串的热图用于优化等等。
可以免费从CPAN获取: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

OP说:“我无法通过调试器逐步执行正则表达式。” - quantum
你有演示文稿的链接吗? - rook
3
@Rook,你可以在https://www.youtube.com/watch?v=zcSFIUiMgAs观看演示文稿。 - Starfish

7

这似乎与https://www.regexpal.com/完全相同。 - MrWhite

6

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接