2013-07-08 2 views
7

Я использую регулярные выражения для проверки ввода пользователя. Теперь я могу настроить регулярное выражение, и это поможет пользователю увидеть пример того, как должен быть отформатирован определенный файл.C# Код для генерации строк, соответствующих регулярному выражению

Возможно ли сгенерировать строки, соответствующие произвольному регулярному выражению? И есть ли какая-то реализация, используемая где-то?

ОБНОВЛЕНИЕ: Из-за лицензии я не могу использовать REX. Существуют ли другие возможности?

+1

Предлагаю посмотреть: http://research.microsoft.com/en-us/projects/rex/, они делают такую ​​вещь. сообщите мне, если это сработает для вас. –

+1

Проверьте этот сайт: http://debuggex.com. Введите любое регулярное выражение, которое вы хотите, и посмотрите на раздел «Некоторые случайные совпадения». Вы можете быть удивлены предложениями, когда ваше регулярное выражение начинает усложняться. – Stephan

+0

Что может быть создано '. *'? – Toto

ответ

6

Попробуйте использовать это приложение Rex может сделать это :)

http://research.microsoft.com/en-us/projects/rex/

Для Java это https://code.google.com/p/xeger/

Таким образом, есть много регулярного выражения соответствует генераторам :)

И это: https://github.com/moodmosaic/Fare

Это xeger обертка в C#

+0

Rex классный, но из-за лицензии я не могу его использовать. – schoetbi

+1

@schoetbi Я нашел этот https://github.com/moodmosaic/Fare это оболочка для xeger в C#, попробуйте это :) – wudzik

+0

Проезд выглядит хорошо, он включает в себя порт Xeger. Я дам ему попробовать – schoetbi

0

Почти наверняка нет, нет.

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

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

+0

Я думаю, что у вас должен быть класс, подобный regexparser в .net, и вместо проверки правил выберите пример допустимых символов для каждого токена в регулярном выражении и добавьте его в строку примера. – schoetbi

+0

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

+0

Нет пользователя, который еще не ввел строку для соответствия. Я хотел бы представить ему верные примеры. – schoetbi

1

, как указано в комментарии, Rex инструмент будет делать трюк -

Использование Rex для создания строк, которые соответствуют вашей схеме:

запустить rex.exe следующим образом:

rex.exe "your_regex_pattern_here" /k:your_required_examples_num_here 

подробнее об этом: Rex Guide

2

Некоторые решения:

(1) Если регулярное выражение написано вами (а не пользователем) и редко изменяется, зачем создавать что-либо программно? Вы могли бы просто создать несколько хороших примеров вручную.

(2) Используйте готовое решение. (см. другие ответы)

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

(4) Реализовать парсер, который преобразует регулярное выражение в дерево построения строк, которое состоит, например, узлов ниже. Каждый узел имеет метод CreateRandomString, который следует определенным правилам. Создание случайной строки означает вызов этого метода для корневого узла.

конкатенация: Проведите все дочерние поддеревья и соедините результаты на заказ.

случайный выбор: Выберите случайное дочернее поддерево и переместите его. Верните результат.

умножение: создать случайное число n между a и b. Пройдите в поддереве n раз и соедините результаты.

лист: возвращает постоянную строку.

Создание парсера - сложная часть :), особенно вложенные структуры. (Я написал один для синтаксиса, аналогичного регулярным выражениям.)

+0

I thoght о номере 4, так как синтаксический анализатор регулярных выражений .net-инфраструктуры управляется чистым. Но потом я нашел тариф, который работает довольно хорошо. Регулярное выражение изменяется, и есть несколько из них, и они также настраиваются пользователем (но не конечным пользователем);) – schoetbi