Вопрос по regex, .net, string, permutation, c# – Генерация всех перестановок текста из регулярного выражения в C #

0

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

Пример:

var pattern = "^My (?:biological|real)? Name is Steve$";
var permutations = getStringPermutations(pattern);

Это вернет список строк ниже:

Меня зовут стив

Мое настоящее имя Стив

Мое биологическое имя стив

Обновить: Очевидно, что регулярное выражение имеет бесконечное количество совпадений, поэтому я хочу генерировать только из необязательных строковых литералов, как в (?: Bio | real)? из моего примера выше. Что-то вроде (.) * Имеет слишком много совпадений, поэтому я не буду генерировать их из этого.

в этом случае да Chris Kooken
Так что это должно начаться сMy, право? Ты нене хочу поймать перестановку, какСтив, мое настоящее имя? Anthony

Ваш Ответ

3   ответа
1

Если вы ограничиваете себя подмножеством регулярных выражений, которые закреплены на обоих концах и содержат только буквальный текст, подстановочные знаки из одного символа и чередование, соответствующие строки должны быть довольно легко перечислить. Я'd, вероятно, переписать регулярное выражение в виде грамматики BNF и использовать ее для создания исчерпывающего списка подходящих строк. Для вашего примера:

   ->   
  -> "My "
 -> "" | "real" | "biological"
    -> " name is Steve"

Начните с производств, которые имеют только терминальные символы в RHS, и перечислите все возможные значения, которые может принять нетерминал в LHS. Затем пройдите до постановок с нетерминалами в RHS. Для объединения нетерминальных символов сформируйте декартово произведение множеств, представленных каждым нетерминалом RHS. Для чередования возьмем объединение множеств, представленных каждой опцией. Продолжайте, пока немы прошли путь до, затем вы'сделано.

Тем не менее, как только вы включите «*» или '+' операторы, вы должны бороться с бесконечным числом совпадающих строк. И если вы также хотите обрабатывать расширенные функции, такие как обратные ссылки ... вы 'вероятно, вы уже на пути к чему-тоизоморфна проблеме останова!

0

s эскиз функции, которую я написал, чтобы взять список строк и вернуть список всех переставленных возможностей: (взяв символ из каждого)

public static List<string> Calculate(List<string> strings) {
            List<string> returnValue = new List<string>();
            int[] numbers = new int[strings.Count];
            for (int x = 0; x < strings.Count; x++) {
                numbers[x] = 0;
            }
            while (true) {
                StringBuilder value = new StringBuilder();
                for (int x = 0; x < strings.Count; x++) {
                    value.Append(strings[x][numbers[x]]);
                    //int absd = numbers[x];
                }
                returnValue.Add(value.ToString());
                numbers[0]++;
                for (int x = 0; x < strings.Count-1; x++) {
                    if (numbers[x] == strings[x].Length) {
                        numbers[x] = 0;
                        numbers[x + 1] += 1;
                    }
                }
                if (numbers[strings.Count-1] == strings[strings.Count-1].Length)
                    break;

            }
            return returnValue;
        }
</string></string></string></string>
0

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

Похожие вопросы