декомпилятор регулярных выражений - PullRequest
4 голосов
/ 28 мая 2011

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

$text =~ /(((\w)\W*(?{$^R.(0+( q{a}lt$3))})) {8}(?{print +pack"B8" ,$^Rand ""})) +/x;

Ответы [ 3 ]

17 голосов
/ 28 мая 2011

Использование YAPE::Regex::Explain (не уверен, что это хорошо, но это первый результат в поиске):

use YAPE::Regex::Explain;
my $REx = qr/(((\w)\W*(?{$^R.(0+( q{a}lt$3))})) {8}(?{print +pack"B8" ,$^Rand ""})) +/x;
my $exp = YAPE::Regex::Explain->new($REx)->explain;
print $exp;

У меня есть объяснение как:

  (                        group and capture to \1 (1 or more times
                           (matching the most amount possible)):
----------------------------------------------------------------------
    (                        group and capture to \2 (8 times):
----------------------------------------------------------------------
      (                        group and capture to \3:
----------------------------------------------------------------------
        \w                       word characters (a-z, A-Z, 0-9, _)
----------------------------------------------------------------------
      )                        end of \3
----------------------------------------------------------------------
      \W*                      non-word characters (all but a-z, A-Z,
                               0-9, _) (0 or more times (matching the
                               most amount possible))
----------------------------------------------------------------------
      (?{$^R.(0+(              run this block of Perl code
      q{a}lt$3))})
----------------------------------------------------------------------
    ){8}                     end of \2 (NOTE: because you are using a
                             quantifier on this capture, only the
                             LAST repetition of the captured pattern
                             will be stored in \2)
----------------------------------------------------------------------
    (?{print +pack"B8"       run this block of Perl code
    ,$^Rand ""})
----------------------------------------------------------------------
  )+                       end of \1 (NOTE: because you are using a
                           quantifier on this capture, only the LAST
                           repetition of the captured pattern will be
                           stored in \1)

Есть 2 блока кода Perl, которые должны анализироваться независимо.

В первом блоке:

$^R . (0 + (q{a} lt $3))

здесь $^R - это «результат оценки последнего успешного (?{ code }) утверждения регулярного выражения», а выражение (0 + (q{a} lt $3)) дает 1, если третий захват находится в [b-z], 0 в противном случае.

Во втором блоке:

print +pack "B8", $^R and ""

интерпретирует предыдущий результат вычисления как двоичную строку (big-endian), получает число, преобразовывает его в соответствующий символ и, наконец, выводит его на печать.


Вместе регулярное выражение находит каждые 8 ​​буквенно-цифровых символов, а затем обрабатывает символы из [b-z] как двоичную цифру 1, иначе 0. Эти 8 двоичных цифр затем интерпретируются как код символа, и этот символ выводится на печать.

Например, буква «H» = 0b01001000 будет напечатана при совпадении со строкой

$test = 'OvERfLOW';
1 голос
/ 28 мая 2011

Я не уверен, что все в этом утверждении, но для анализа регулярных выражений я использую этот сайт

http://xenon.stanford.edu/~xusch/regexp/analyzer.html

0 голосов
/ 28 мая 2011

Я всегда находил, Редактор регулярных выражений OptiPerl действительно хорош в таких вещах

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