正则表达式可能会变得非常复杂。缺乏空格使它们难以阅读。我无法使用调试器逐步执行正则表达式。那么专家们如何调试复杂的正则表达式呢?
此外,据开发人员介绍,在与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: 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", ...);
我认为不需要。如果你的正则表达式太复杂,且出现问题以至于需要使用调试器,那么你应该创建一个特定的解析器或使用其他方法。这会使代码更易读和可维护。
有一个非常好用的免费工具,Regex Coach。最新版本只适用于Windows系统,作者Edmund Weitz博士停止了Linux版本的维护,因为下载量太少,但是在下载页面上可以找到旧版本的Linux版。
对于我来说,我通常使用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
------------------------------------------------------------------
RegEx.Replace(...)
)设置断点,切换到“立即窗口”并尝试一些'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
命令,以快速定位问题。 - DeepSpace101