2009-05-27 1 views
0

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

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

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
Стив

ответ

1

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

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

4

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

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

+0

Как бы я «объединил их с правилами регулярных выражений»? словарь Regex не будет соответствовать моей цели, так как мне нужен бесконечный диапазон регулярных выражений. Начиная с наименее сложной формы и все более и более сложной по отношению к бесконечности. – Stefan