您如何调试正则表达式?[关闭]


149

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


2
我相信“测试”您的正则表达式比“调试”它重要得多。通常,您可以很容易地查看正则表达式(或使用答案中建议的工具之一)来弄清楚正则表达式的情况,但是要真正确定它的作用,您应该使用所有可能的边界情况来测试正则表达式。测试最终将弄清您真正想要做的事情,并使调试无用:)
baol 2010年

7
这似乎很有趣:http : //www.debuggex.com/ (由于问题已经关闭,我无法添加真实的答案。)
KajMagnus

如果您拥有Visual Studio,则可以在问题区域附近设置一个断点(例如:RegEx.Replace(...),切换到“立即窗口”,然后尝试一些'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)命令将问题快速归零。)
DeepSpace101,2014年

2
令我惊讶的是,似乎没有人提到regex101.com,它具有实际的调试器并且也由Web托管。
mechalynx

1
即使在2017年,我仍然相信regexbuddy仍然是我能找到的最好的工具,价格仍然保持在40美元左右。我经常使用具有不同正则表达式风格的不同语言来工作,所以我常常感到困惑。使用regexbuddy,它使我从语法中解脱出来
code4j

Answers:


68

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

替代文字

另外,根据开发人员的说法,与WINE一起使用时,该工具几乎可以在Linux上完美运行。


31
太糟糕了,它仅适用于Windows,价格为40美元。
kennytm'2

25
根据开发人员的说法,它可以通过WINE在Linux上运行:regexbuddy.com/wine.html。大约40美元的费用...您的时间价值多少?
米克,2010年

18
这不是免费软件。
codeholic 2010年

38
谁说的是或要求的?
蒂姆·皮茨克

21
好吧,就像米克所说,您的时间价值多少?“金钱可以买到的最好的工具”不一定总要花钱,但有时却要花钱。此外,JGSoft持续发展伟大品质的产品与卓越的用户服务。我什至从他们真正不需要的软件(例如RegexMagic)那里购买了软件,因为我想支持它们并使它们继续运转。您不知道自己缺少什么。说真的
蒂姆·皮茨克

52

使用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:关闭1(6)
   6:REF1(8)
   8:结束(0)
民1
将REx“(。)\ 1”与“ foobar”匹配
   0 <> <foobar> | 1:开1(3)
   0 <> <foobar> | 3:REG_ANY(4)
   1 <f> <oobar> | 4:CLOSE1(6)
   1 <f> <oobar> | 6:REF1(8)
                                  失败了...
   1 <f> <oobar> | 1:开1(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", ...);

12
+1:为什么有人会喜欢Regexbuddy?
查尔斯·斯图尔特

1
我喜欢这种方法,即使我认为正则表达式的伙伴更好。

回声“ foobar” | egrep“(。)\ 1”
DmitrySandalov 2013年

30

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

很好,因为它非常直观: Debuggex regex助手的照片


debuggex实际上对我不起作用:字体是由JavaScript强制执行的,并且显然无法工作(我有等宽字体,firefox控制台完美地使用了它们)。结果,显示无法使用。此外,对于每个版本,JavaScript测试都会通过许多测试用例挂起浏览器(不仅在触发时还会测试一次)。最后,一些建议的正则表达式已被修改并且与预期的不匹配。
7heo.tk,2016年

28

当我卡在正则表达式上时,通常会转向:https : //regexr.com/

非常适合快速测试出问题的地方。


1
该工具非常有用:它是网络托管的,因此无需安装,它是实时的,因此调试是梦a以求的,它甚至包含有用的工具提示和特殊字符列表,以防万一您不记得了。非常完美,非常感谢
Jason Ridge

不幸的是,该工具(仍然)不允许您更改正则表达式定界符(即使对于PCRE引擎也是如此)-它们固定为/(斜杠)。这对我来说是一台最畅销的产品。
MrWhite

19

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

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

(...)

替代文字

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


2
Kodos没有提供真正的调试功能。您不能步进正则表达式也不能暂停执行。
候选资格

在Mac上运行的任何提示?Sourceforge网站没有提供有关Mac安装的任何信息,而我的Google-fu似乎让我失望了。
亚当·帕金

尽管这似乎是Python2,并且自2006年(在撰写本文时14年前)以来未进行过更新?
MrWhite

13

我认为他们没有。如果您的正则表达式太复杂,并且有问题,需要调试器,则应创建一个特定的解析器,或使用其他方法。它将更具可读性和可维护性。


4
杜德(Dude),您是在查看regexbuddy屏幕截图后发布的?
rook 2010年

2
每个人都会对此表示反对,但这不是一个坏主意。每个人都认为正则表达式引擎使用大量正则表达式是最有效的。这不一定是正确的,而且它们绝对不容易阅读。分解您的正则表达式。
Dan Rosenstark 2010年

1
@迈克尔·布鲁克斯:不,以前是这样。看完屏幕截图后,我可以调试正则表达式就可以了。但是我坚持我的想法:当正则表达式变得太复杂时,是时候换种方式了。
Valentin Rocher 2010年

12

Regex Coach是一款出色的免费工具。最新版本仅适用于Windows。它的作者Edmund Weitz博士停止维护Linux版本,因为下载的人太少,但是在下载页面上有适用于Linux的旧版本。


8

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

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


OP说:“我无法通过调试器使用正则表达式。”
2012年

您是否有演示文稿的链接?
rook 2012年



6

我用自己的眼睛调试我的正则表达式。这就是为什么我使用/x修饰符,为它们写注释并将其分成几部分的原因。阅读Jeffrey Friedl的Mastering Regular Expressions掌握正则表达式)以了解如何开发快速且可读的正则表达式。各种正则表达式调试工具仅会引起伏都教编程。


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
------------------------------------------------------------------


3

如果感觉卡住,我想返回并使用txt2re直接从示例文本生成正则表达式(尽管我通常最终会手动调整生成的正则表达式)。




2

使用PCRE这样的符号编写reg exe就像编写汇编程序:可以在脑海中看到相应的有限状态自动机,这很好,但是很难快速维护。

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

更具反映性的方法是使用数据表示形式以您的编程语言生成正则表达式,并具有适当的抽象来构建它们。 Olin Shiver对方案正则表达式的介绍很好地概述了设计这些数据表示形式时面临的问题。


解析器组合器确实是一个很棒的方法:Haskell中的Parsec和PArrows,Ruby中的rsec,C ++中的Boost Spirit,Python中的PyParsing,Perl中的Perl6 :: Rules等
。–

2

我经常使用pcretest-几乎不是“调试器”,但是它可以在纯文本SSH连接上工作,并且可以准确解析我需要的正则表达式:我的(C ++)代码链接到libpcre,因此在魔术和魔术方面的细微差别没有困难不是,等等。

总的来说,我同意以上需要正则表达式调试器的人的看法。对我而言,使用正则表达式最困难的通常不是正则表达式本身,而是使它们工作所需的多层引号。





0

对我来说,在看完正则表达式后(因为我相当流利,并且几乎总是使用/ x或同等的东西),我可能会调试而不是测试(如果我不确定是否会遇到一些简并的匹配项(即过度回溯的东西))看看我是否可以通过修改运算符的贪婪度来解决此类问题。

为此,我将使用上述方法之一:pcretest,RegexBuddy(如果当前工作场所已获得许可)或类似方法,有时,如果我使用C#正则表达式,则需要在Linqpad中对其进行计时。

(perl技巧对我来说是一个新的技巧,因此也可能会将其添加到我的regex工具包中。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.