Рекомендуемый метод тестирования регулярных выражений?

Я новичок в регулярных выражениях, я смог написать несколько проб и ошибок, поэтому попробовал несколько программ, чтобы помочь мне написать выражение, но программы были сложнее понять, чем сами регулярные выражения. Любые рекомендуемые программы? Я делаю большую часть своего программирования под Linux.

11 ответов


к сожалению, если вы используете linux, у вас не будет доступа к одному из лучших:Regex Buddy.

RegexBuddy-это ваш идеальный компаньон для работы с регулярными выражениями. Легко создавать регулярные выражения, которые соответствуют тому, что вы хотите. Четко понимать сложные регексы, написанные другими. Быстро протестируйте любое регулярное выражение на образцах строк и файлов, предотвращая ошибки в фактических данных. Отладка без догадок путем шагать через фактический процесс сопоставления. Используйте регулярное выражение с фрагментами исходного кода, автоматически адаптированными к особенностям вашего языка программирования. Сбор и документирование библиотек регулярных выражений для последующего повторного использования. GREP (поиск и замена) через файлы и папки. Интегрируйте RegexBuddy с вашими любимыми инструментами поиска и редактирования для мгновенного доступа. (с их сайта)


попробовать YAPE::Regex:: Explain для Perl:

#!/usr/bin/perl

use strict;
use warnings;

use YAPE::Regex::Explain;

print YAPE::Regex::Explain->new(
    qr/^\A\w{2,5}0{2}\S \n?\z/i
)->explain;

выход:

The regular expression:

(?i-msx:^\A\w{2,5}0{2}\S \n?\z)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?i-msx:                 group, but do not capture (case-insensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  \A                       the beginning of the string
----------------------------------------------------------------------
  \w{2,5}                  word characters (a-z, A-Z, 0-9, _)
                           (between 2 and 5 times (matching the most
                           amount possible))
----------------------------------------------------------------------
  0{2}                     '0' (2 times)
----------------------------------------------------------------------
  \S                       non-whitespace (all but \n, \r, \t, \f,
                           and " ")
----------------------------------------------------------------------
                           ' '
----------------------------------------------------------------------
  \n?                      '\n' (newline) (optional (matching the
                           most amount possible))
----------------------------------------------------------------------
  \z                       the end of the string
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

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


большинство ошибок regex делятся на три категории:

  • Тонкий Бездействие оставив '^' в начале и '$' в конце, используя '*', где вы должны использовать '+' - это только начинающие ошибки, но его общим для багги regex по-прежнему пройти все автоматические тесты.

  • случайный успех - где часть регулярного выражения просто полностью неверна и суждено потерпеть неудачу в 99% использования в реальном мире, но по чистой случайности ему удается пройти полдюжины автоматических тестов, которые вы написали.

  • слишком много успеха - где одна часть регулярного выражения соответствует намного больше, чем вы думали. Например, токен [^., ]* также будет соответствовать \r и \n, что означает, что ваше регулярное выражение теперь может соответствовать нескольким строкам текста, даже если вы завернули его в ^ и $.

там действительно нет замените для правильного изучения regex. Прочитайте справочное руководство по движку regex и используйте такой инструмент, как Regex Buddy, чтобы поэкспериментировать и ознакомиться с все особенностей и особенно обратите внимание на любые специальные или необычные поведения, которые они могут проявлять. Если вы изучите regex правильно, вы избежите большинства ошибок, упомянутых выше, и вы будете знать, как написать только небольшое количество автоматических тестов, которые могут гарантировать все края случаях без проверки очевидных вещей (не [A-Z] действительно буква между A и A? Я лучше напишу 26 вариантов модульного теста, чтобы убедиться!).

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


отличная программа для помощи вам в написании регулярных выражений будет Perl; вы можете попробовать регулярное выражение, чтобы увидеть, соответствует ли оно очень легко:

perl -e 'print "yes!\n" if "string" =~ /regex to test/'

посмотреть это так вопрос по модульному тестированию regexes для получения дополнительной информации о тестировании регулярных выражений в целом.


можно попробовать через веб-сайты, которые дают вам подсказки и мгновенное удовлетворение как этот. Создание простого скрипта perl, который вы можете легко изменить, также является отличным полигоном для тестирования. Что-то вроде следующего:

#!/usr/bin/perl

$mystring = "My cat likes to eat tomatoes.";
$mystring =~ s/cat/dog/g;
print $mystring;

также проверить re ПРАГМА, который покажет, как regexes компилируются, а также как они выполняются:

$ perl -Mre=debugcolor -e '"huzza" =~ /^(hu)?z{1,2}za$/'

вывод:

    Compiling REx "^(hu)?z{1,2}za$"
    Final program:
       1: BOL (2)
       2: CURLYM[1] {0,1} (12)
       6:   EXACT  (10)
      10:   SUCCEED (0)
      11: NOTHING (12)
      12: CURLY {1,2} (16)
      14:   EXACT  (0)
      16: EXACT  (18)
      18: EOL (19)
      19: END (0)
    floating "zza"$ at 0..3 (checking floating) anchored(BOL) minlen 3 
    Guessing start of match in sv for REx "^(hu)?z{1,2}za$" against "huzza"
    Found floating substr "zza"$ at offset 2...
    Guessed: match at offset 0
    Matching REx "^(hu)?z{1,2}za$" against "huzza"
       0           |  1:BOL(2)
       0           |  2:CURLYM[1] {0,1}(12)
       0           |  6:  EXACT (10)
       2           | 10:  SUCCEED(0)
                                        subpattern success...
                                      CURLYM now matched 1 times, len=2...
                                      CURLYM trying tail with matches=1...
       2           | 12:  CURLY {1,2}(16)
                                        EXACT  can match 2 times out of 2...
       3           | 16:    EXACT (18)
       5           | 18:    EOL(19)
       5           | 19:    END(0)
    Match successful!
    Freeing REx: "^(hu)?z{1,2}za$"

http://regex-test.com действительно хороший / профессиональный вебсайт который позволяет вам испытать много разных видов регулярных выражений.


мой личный фаворит Rubular (отказ от ответственности: онлайн-инструмент).

Это красиво и просто, и довольно быстро.


Если вы готовы купить инструмент,Комодо, ActiveState является отличным редактором для скриптовых языков и поставляется с мощным прекрасным помощником regex. Это кросс-платформенный, но не бесплатно. Это помогло мне из нескольких трудных ситуаций, когда я не совсем понимал, почему вещи не разбирались и поддерживали несколько типов разновидностей regexen.


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