Regex 有哪些工具可以调试/单步执行正则表达式?

Regex 有哪些工具可以调试/单步执行正则表达式?,regex,debugging,Regex,Debugging,虽然有很多很好的在线和离线工具用于测试正则表达式,但我还没有找到一个工具(除此之外),可以让我看到正则表达式引擎查找匹配项(或者查找不匹配项)所采取的步骤 有人知道做这件事的工具吗?我最初排除在外的原因是因为它是商业性的,我更愿意在决定付款之前仔细考虑我的选择 为了更清楚地说明我想要什么,这里是(他们主页上)的屏幕截图: 也许RegexCoach提供了您想要的 这可能是因为正则表达式引擎如何找到匹配项并不重要。RegexBuddy的屏幕截图让我想使用另一个RegexMatcher,因为不需要进行

虽然有很多很好的在线和离线工具用于测试正则表达式,但我还没有找到一个工具(除此之外),可以让我看到正则表达式引擎查找匹配项(或者查找不匹配项)所采取的步骤

有人知道做这件事的工具吗?我最初排除在外的原因是因为它是商业性的,我更愿意在决定付款之前仔细考虑我的选择

为了更清楚地说明我想要什么,这里是(他们主页上)的屏幕截图:
也许RegexCoach提供了您想要的


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

通常,您会将正则表达式转换为或,后者可以处理正则表达式而无需回溯


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

它没有RegexBuddy强大,但它是一个简单的在线界面:


您可以将鼠标移到表达式的某些部分,它将告诉您它在做什么。非常基本,但当您做一些愚蠢的事情时,它确实可以节省时间。

在Perl中,您可以只做或做

例如,如果在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))"
编译REx“(Regexp?Buddy是(糟糕的|可接受的|棒极了))”
最终课程:
1:OPEN1(3)
3:精确(6)
6:CURLY{0,1}(10)
8:精确(0)
10:精确(14)
14:OPEN2(16)
16:准确(18)
18:TRIEC-EXACT[cw](29)#这是Perl5.10中的一个新特性
29:2(31)
31:1(33)
33:完(0)
锚定“Regex”在0浮动“Buddy is a”在5..6(检查浮动)minlen 19
在sv中猜测REx的比赛开始”(Regexp?Buddy是(可怕的|可接受的|可怕的)),而不是“即使我自己这么说:“Regexpddy是可怕的””
在偏移量34处找到浮动子字符串“Buddy is a”。。。
在偏移量29处找到锚定子字符串“Regex”。。。
起始位置与#/^/m不矛盾。。。
猜测:在偏移量29处匹配
匹配REx“(Regexp?Buddy是(可怕的|可接受的|可怕的))”与“RegexBuddy是可怕的””
29 | 1:OPEN1(3)
29 | 3:精确(6)
34 | 6:CURLY{0,1}(10)
精确可以匹配1次中的0次。。。
34 | 10:精确(14)
43 | 14:OPEN2(16)
43 | 16:准确(18)
44| 18:TRIEC-EXACT[cw](29)
44<是一个>|状态:3之后的状态:2接受:0 Charid:2 CP:77
45|状态:10后的状态:3接受:0 Charid:7 CP:65
46|状态:11之后的状态:10接受:0 Charid:b CP:73
47|状态:12后的状态:11接受:0 Charid:c CP:6f
48|状态:12接受:0 Charid:d CP:6d在状态:13之后
49|状态:14之后的状态:13接受:0 Charid:7 CP:65
50|状态:0后状态:14接受:1 Charid:3 CP:0
有1个可能的匹配项
只剩下一场比赛:#3
50| 29:CLOSE2(31)
50| 31:CLOSE1(33)
50| 33:END(0)
比赛成功!
释放雷克斯:“(Regexp?Buddy是(糟糕的|可接受的|棒极了))”
(注意:我更改了输出的某些部分,以便更好地突出显示)

是我见过的最好的图形化方法。它基本上向您显示给定正则表达式的图表外观,具有匹配的基本高亮显示,底部有一个滑块,可以让您逐步浏览匹配和DFA图表:

尝试使用在线正则表达式测试仪验证正则表达式模式。
编辑器在键入时正在更新,可以根据需要更改标志

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

来自CodVerter的正则表达式测试器的IP正则表达式模式示例

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

下面是关于这个工具的简短介绍


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

谢谢,但我已经安装了RegexCoach。它有简单的分步功能,但很难比较使用它的不同正则表达式之间的性能。此外,它不支持PCRE中提供的某些正则表达式扩展。是的,我看到了一些例子(),但如果我坚持使用PCRE,那么我希望能够确保我不会错过一些让它成为回溯盛宴的东西。好的,在阅读之后,似乎regexp引擎确实在使用回溯,主要是为了支持组。很抱歉我的误导性帖子。是的,这正是我在这篇文章中试图避免的=)事实上例如,可以在没有回溯的情况下进行匹配。Perl的regex引擎(从5.10开始)用于。屏幕截图已消失。