正则表达式可能会变得非常复杂。缺少空格使它们难以阅读。我无法使用调试器来调试正则表达式。那么专家如何调试复杂的正则表达式?
RegEx.Replace(...)
,切换到“立即窗口”,然后尝试一些'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
命令将问题快速归零。)
正则表达式可能会变得非常复杂。缺少空格使它们难以阅读。我无法使用调试器来调试正则表达式。那么专家如何调试复杂的正则表达式?
RegEx.Replace(...)
,切换到“立即窗口”,然后尝试一些'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
命令将问题快速归零。)
Answers:
您可以购买RegexBuddy并使用其内置的调试功能。如果您每年使用正则表达式两次以上,则可以及时节省这笔钱。RegexBuddy还可以帮助您创建简单和复杂的正则表达式,甚至可以使用多种语言为您生成代码。
另外,根据开发人员的说法,与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:关闭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", ...);
我将添加另一个,以便我不会忘记它:debuggex
很好,因为它非常直观:
当我卡在正则表达式上时,通常会转向:https : //regexr.com/
非常适合快速测试出问题的地方。
/
(斜杠)。这对我来说是一台最畅销的产品。
我使用Kodos -Python正则表达式调试器:
Kodos是一个Python GUI实用程序,用于为Python编程语言创建,测试和调试正则表达式。Kodos应该帮助任何开发人员轻松有效地用Python开发正则表达式。由于Python的正则表达式实现基于PCRE标准,因此Kodos应该使其他遵循PCRE标准的编程语言(Perl,PHP等)的开发人员受益。
(...)
在Linux,Unix,Windows,Mac上运行。
我认为他们没有。如果您的正则表达式太复杂,并且有问题,需要调试器,则应创建一个特定的解析器,或使用其他方法。它将更具可读性和可维护性。
Regex Coach是一款出色的免费工具。最新版本仅适用于Windows。它的作者Edmund Weitz博士停止维护Linux版本,因为下载的人太少,但是在下载页面上有适用于Linux的旧版本。
我刚刚看到由创建者Damian Conway进行的Regexp :: Debugger演示。令人印象深刻的东西:以交互方式或在“记录的”执行文件(存储在JSON中)就地运行或使用命令行工具(rxrx),在任意点上来回前进,在断点或事件上停止,彩色输出(用户可配置) ),正则表达式和字符串上的热图以进行优化等。
在CPAN上免费提供:http: //search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm
我用自己的眼睛调试我的正则表达式。这就是为什么我使用/x
修饰符,为它们写注释并将其分成几部分的原因。阅读Jeffrey Friedl的Mastering Regular Expressions(掌握正则表达式)以了解如何开发快速且可读的正则表达式。各种正则表达式调试工具仅会引起伏都教编程。
对于我来说,我通常使用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
------------------------------------------------------------------
如果您是Mac用户,我只是遇到了这个用户:
http://atastypixel.com/blog/reginald-regex-explorer/
它是免费的,并且易于使用,并且对我来说,与RegExs接触通常是一个很大的帮助。
使用PCRE这样的符号编写reg exe就像编写汇编程序:可以在脑海中看到相应的有限状态自动机,这很好,但是很难快速维护。
不使用调试器的原因与不使用带有编程语言的调试器的原因大致相同:您可以修复局部错误,但它们不会帮助您解决导致您首先犯局部错误的设计问题。地点。
更具反映性的方法是使用数据表示形式以您的编程语言生成正则表达式,并具有适当的抽象来构建它们。 Olin Shiver对方案正则表达式的介绍很好地概述了设计这些数据表示形式时面临的问题。
我经常使用pcretest-几乎不是“调试器”,但是它可以在纯文本SSH连接上工作,并且可以准确解析我需要的正则表达式:我的(C ++)代码链接到libpcre,因此在魔术和魔术方面的细微差别没有困难不是,等等。
总的来说,我同意以上需要正则表达式调试器的人的看法。对我而言,使用正则表达式最困难的通常不是正则表达式本身,而是使它们工作所需的多层引号。
我使用ActiveState Komodo附带的Rx工具包。
您可以尝试以下一种方法 http://www.pagecolumn.com/tool/regtest.htm