有哪些用于调试/逐步执行正则表达式的工具?

6
虽然有很多在线和离线工具可以测试正则表达式,但我还没有找到一个工具(除了 RegexBuddy)让我看到正则表达式引擎查找匹配项(或者查找不到匹配项)所需的步骤。
是否有人知道有这种工具?我最初排除 RegexBuddy是因为它是商业软件,我想在决定购买之前先看看其他选项。
为了更清楚地说明我的要求,这里是 RegexBuddy的截图(来自他们的主页): http://img166.imageshack.us/img166/1272/debug.png

1
截图已经消失。 - Brad Gilbert
6个回答

4
在Perl中,你可以随时使用use re 'debug';use re 'debugcolor';。例如,如果你在Perl中输入以下内容:
use strict;
use warnings;
use 5.010;
use re 'debug';

# using the same strings as the question's image for reference:

my $str = 'Even if I do say so myself: "RegexBuddy is awesome"';
$str =~ /(Regexp?Buddy is (awful|acceptable|awesome))/;

这是输出的结果:

Compiling REx "(Regexp?Buddy is (awful|acceptable|awesome))"
Final program:
   1: OPEN1 (3)
   3:   EXACT <Regex> (6)
   6:   CURLY {0,1} (10)
   8:     EXACT <p> (0)
  10:   EXACT <Buddy is > (14)
  14:   OPEN2 (16)
  16:     EXACT <a> (18)
  18:     TRIEC-EXACT[cw] (29) # this is a new feature in Perl 5.10
          <wful> 
          <cceptable> 
          <wesome> 
  29:   CLOSE2 (31)
  31: CLOSE1 (33)
  33: END (0)

anchored "Regex" at 0 floating "Buddy is a" at 5..6 (checking floating) minlen 19 
Guessing start of match in sv for REx "(Regexp?Buddy is (awful|acceptable|awesome))" against 'Even if I do say so myself: "RegexBuddy is awesome"'
Found floating substr "Buddy is a" at offset 34...
Found anchored substr "Regex" at offset 29...
Starting position does not contradict # /^/m...
Guessed: match at offset 29

Matching REx "(Regexp?Buddy is (awful|acceptable|awesome))" against 'RegexBuddy is awesome"'
  29 <'lf: "'> <RegexBuddy>  |  1:OPEN1(3)
  29 <'lf: "'> <RegexBuddy>  |  3:EXACT <Regex>(6)
  34 <Regex> <Buddy is a>    |  6:CURLY {0,1}(10)
                                  EXACT <p> can match 0 times out of 1...
  34 <Regex> <Buddy is a>    | 10:  EXACT <Buddy is >(14)
  43 <y is > <'awesome"'>    | 14:  OPEN2(16)
  43 <y is > <'awesome"'>    | 16:  EXACT <a>(18)
  44 < is a> <'wesome"'>     | 18:  TRIEC-EXACT[cw](29)
  44 < is a> <'wesome"'>     |      State:    2 Accepted:    0 Charid:  2 CP:  77 After State:    3
  45 < is aw> <'esome"'>     |      State:    3 Accepted:    0 Charid:  7 CP:  65 After State:   10
  46 < is awe> <'some"'>     |      State:   10 Accepted:    0 Charid:  b CP:  73 After State:   11
  47 < is awes> <'ome"'>     |      State:   11 Accepted:    0 Charid:  c CP:  6f After State:   12
  48 < is aweso> <'me"'>     |      State:   12 Accepted:    0 Charid:  d CP:  6d After State:   13
  49 < is awesom> <'e"'>     |      State:   13 Accepted:    0 Charid:  7 CP:  65 After State:   14
  50 < is awesome> <'"'>     |      State:   14 Accepted:    1 Charid:  3 CP:   0 After State:    0
                                    got 1 possible matches
                                    only one match left: #3 <wesome>
  50 < is awesome> <'"'>     | 29:  CLOSE2(31)
  50 < is awesome> <'"'>     | 31:  CLOSE1(33)
  50 < is awesome> <'"'>     | 33:  END(0)
Match successful!
Freeing REx: "(Regexp?Buddy is (awful|acceptable|awesome))"

抱歉,我的中文水平很高,但我无法直接修改HTML格式的翻译内容。如果您能提供纯文本或其他格式的内容,我将尽力为您提供准确和易于理解的翻译。

2

Debuggex 是我见过的最好的图形化界面。它基本上展示了给定正则表达式的DFA图像,有基本匹配高亮,并在底部提供滑块,让您可以逐步查看匹配和DFA图像:

enter image description here


2

这个在线工具虽然不如RegexBuddy强大,但它提供了简单易用的界面:http://www.gskinner.com/RegExr/

您可以将鼠标悬停在表达式的某些部分上,它会告诉您它正在执行什么操作。虽然很基础,但当您犯了一些错误时,它确实可以节省时间。


1

谢谢,但我已经安装了RegexCoach。它确实具有简单的逐步功能,但使用它很难比较不同正则表达式之间的性能。此外,它不支持PCRE中可用的某些正则表达式扩展。 - Blixt

0

使用CodVerter正则表达式测试工具在线验证正则表达式模式。编辑器能够实时更新,并且可以根据需要更改标志。

作品可以本地保存或通过用户帐户中的高级存储库管理器保存到云端以供进一步编辑。当保存到云端时,您可以生成链接与任何人共享您的作品。

来自CodVerter正则表达式测试工具的IP正则表达式示例 enter image description here

如果您需要一个用于多个正则表达式模式的更复杂的工具,请尝试CodVerter 多个正则表达式模式扫描器

这里是有关此工具的短 教程

(完全披露:我是CodVerter 的开发人员之一)


-1

这可能是因为正则表达式引擎如何找到匹配项并不重要。RegexBuddy的截图让我想使用另一个正则表达式匹配器,因为不应该需要回溯。

通常,您会将正则表达式转换为非确定有限状态自动机(NFA)确定有限状态自动机(DFA),可以处理没有回溯的正则表达式。

话虽如此,我所知道的唯一免费的创建和测试正则表达式的工具是pyreb


是的,我看过一些例子(http://osteele.com/tools/reanimator/),但如果我被卡在PCRE上,那么我希望能够确保我不会错过任何将其变成回溯盛宴的东西。 - Blixt
好的,在阅读了http://www.codinghorror.com/blog/archives/000488.html之后,似乎正则表达式引擎确实使用回溯,主要是为了支持组。对于我误导性的帖子感到抱歉。 - Bluehorn
是的,那正是我想要避免的 =) - Blixt
实际上,在这个特定的例子中,可以在不回溯的情况下进行匹配。自 Perl 5.10 起,它使用Trie 优化实现此目的 - Brad Gilbert

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