Как сгенерировать строку из регулярного выражения на .NET?

Для генерации строк из регулярного выражения использую RexEngine из AutomataDotNet.
Но он не всегда генерирует валидные строки (проверяю результат им же и OOTB Regex).
Какой библиотекой посоветуете пользоваться для этой задачи?

Сейчас код выглядит так, но хочется избавиться от проверки генерации на валидность:
public static IEnumerable<string> GenerateValidStrings(string pattern, int count = 10, RegexOptions options = RegexOptions.None)
{
    var rex = new Microsoft.Automata.Rex.RexEngine(Microsoft.Automata.BitWidth.BV16);
    var dotnetRegex = new Regex(pattern, options);
            
    var sfa = rex.CreateFromRegexes(options, pattern);
    var old = new HashSet<string>();

    while (true)
    {
        string member = rex.GenerateMember(sfa);
        if (!dotnetRegex.IsMatch(member)) continue;

        int tryCount = Math.Min(100 + old.Count, 200);
                
        if (old.Contains(member))
        {
            tryCount--;
                    
            if (tryCount == 0)
            {
                throw new InvalidOperationException("can't generate new unique strings");
            }
            continue;
        }

        old.Add(member);
        yield return member;

        if (old.Count == count)
        {
            break;
        }
    }
}
  • Вопрос задан
  • 486 просмотров
Пригласить эксперта
Ответы на вопрос 1
@pro100Code
TechnoCraft Designer Developer
Чтобы генерировать строки из регулярных выражений без необходимости вручную проверять их валидность, ты можешь попробовать библиотеку Fare. Она создана для таких задач и работает корректно с генерацией валидных строк по регулярным выражениям.

используй Xeger generator = new Xeger(pattern);

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

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

Войдите, чтобы написать ответ

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