Какие есть инструменты для отладки / пошагового выполнения регулярного выражения? - PullRequest
5 голосов
/ 16 июля 2009

Хотя есть много хороших онлайн и офлайн инструментов для тестирования регулярных выражений, мне еще предстоит найти инструмент (кроме RegexBuddy ), который позволил бы мне увидеть шаги, которые движок регулярных выражений предпринимает, чтобы найти совпадение (или чтобы найти, что нет никакого соответствия, в этом отношении.)

Кто-нибудь знает какие-нибудь инструменты, которые делают это? Причина, по которой я изначально исключил RegexBuddy , заключается в том, что он коммерческий, и я предпочел бы просмотреть свои варианты, прежде чем принять решение о его оплате.

Чтобы было яснее, что я хочу, вот скриншот с RegexBuddy (с их домашней страницы): http://img166.imageshack.us/img166/1272/debug.png

Ответы [ 6 ]

4 голосов
/ 17 июля 2009

В 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))"

(Примечание: я изменил некоторые части вывода, чтобы он лучше выделялся)

2 голосов
/ 16 июля 2009

Это не так мощно, как RegexBuddy, но это простой онлайн-интерфейс: http://www.gskinner.com/RegExr/

Вы можете навести курсор мыши на часть своего выражения, и оно скажет вам, что оно делает. Очень простой, но он действительно может сэкономить время, когда вы делаете что-то глупое.

1 голос
/ 25 августа 2015

Debuggex имеет лучший графический подход, который я когда-либо видел. По сути, он показывает, как должна выглядеть диаграмма DFA для данного регулярного выражения, имеет базовую подсветку для соответствия и имеет ползунок внизу, который позволяет пошагово проходить по диаграмме соответствия и DFA. -ступенно:

enter image description here

1 голос
/ 16 июля 2009

Возможно, RegexCoach предлагает то, что вы ищете ...

http://weitz.de/regex-coach/

0 голосов
/ 15 февраля 2019

Попробуйте Тестер регулярных выражений CodVerter Онлайновый тестер регулярных выражений для проверки шаблонов регулярных выражений.
Редактор обновляется во время набора текста, и флаги могут быть изменены по желанию.

Работу можно сохранить локально или в облаке для дальнейшего редактирования через расширенный менеджер репозиториев в учетной записи пользователя. при сохранении в облаке вы можете создать ссылку, чтобы поделиться своей работой с кем-либо.

Пример шаблона регулярного выражения IP из тестера регулярных выражений CodVerter enter image description here

Если вам нужен более сложный инструмент для нескольких шаблонов регулярных выражений Попробуйте CodVerter сканер нескольких шаблонов регулярных выражений

Вот краткое руководство об этом инструменте

(полное раскрытие: я один из разработчиков CodVerter)

0 голосов
/ 16 июля 2009

Это, вероятно, так, потому что не должно иметь значения, как механизм регулярных выражений находит совпадение. Скриншот RegexBuddy заставляет меня хотеть использовать другое средство сравнения regexp, так как не должно быть необходимости возвращаться назад.

Как правило, вы бы перевели регулярное выражение в недетерминированный конечный автомат (NFA) или детерминированный конечный автомат (DFA) , который может обрабатывать регулярные выражения без обратного отслеживания.

При этом единственный бесплатный инструмент для создания и тестирования регулярных выражений, о котором я знаю, это pyreb .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...