Система подсчета RegExp - PullRequest
0 голосов
/ 27 мая 2009

Я пытаюсь создать систему, в которой я могу преобразовывать значения RegEx в целые числа и наоборот. где ноль будет самым основным регулярным выражением (вероятно, "/./"), а любые последующие числа будут более сложными регулярными выражениями

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

values = [ "!", ".", "\/", "[", "]", "(", ")", "a", "b", "-", "0", "9", .... ]

и затем взять из этого массива следующим образом:

def get( integer ) 
  if( integer.zero? ) 
    return '';
  end

  integer = integer - 1;

  if( integer < values.length )
    return values[integer]
  end

  get(( integer / values.length ).floor) + get( integer % values.length);
end

sample_regex = /#{get( 100 )}/;

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

Есть ли уже установленный алгоритм для достижения того, что я пытаюсь? если нет, есть предложения?

Thanx
Стив

Ответы [ 2 ]

4 голосов
/ 27 мая 2009

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

Однако, это, вероятно, излишне реализовывать это. Для чего вам это нужно? Разве простой словарь из Number -> RegExp пар ключ-значение не подходит для сопоставления регулярных выражений с уникальными числами?

1 голос
/ 28 мая 2009

Я бы сказал, что // - самое простое регулярное выражение (оно соответствует чему угодно). /./ является довольно сложным, поскольку это просто сокращение для /[^\n]/, которое само по себе является просто сокращением для гораздо более длинного выражения (что это выражение зависит от вашего набора символов). Следующее простейшее выражение будет /a/, где a - это первый символ в вашем наборе символов. Это последнее утверждение поднимает интересную проблему для вашего перечисления: какой набор символов вы будете использовать? Любое перечисление будет привязано к заданному набору символов. Предполагая, что вы начинаете с // как 0, /\x{00}/ (соответствует символу nul) как 1, /\x{01}/ как 2 и т. Д. Затем вы начнете получать интересные регулярные выражения (те, которые соответствуют более чем одной строке) около 129 если вы используете набор ASCII, но для UNICODE 5.0 потребуется до 1114112.

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

...