Welp, просто размышление, но общий вопрос генерации случайных исходных данных, которые соответствуют regex звуки, выполнимые мне для достаточно расслабленного определения случайных и достаточно трудного определения regex. Я думаю о классическом формальном определении, которое позволяет только () | * и символы алфавита.
Регулярные выражения могут быть отображены на формальных машинах, названных конечные автоматы . Такая машина является ориентированным графом с конкретным узлом, названным конечным состоянием, узел, названный начальным состоянием и буквой от алфавита на каждом краю. Слово принято regex, если возможно запуститься в начальном состоянии и пересечь один край, маркированный каждым символом через график и конец в конечном состоянии.
можно было создать график, затем запуститься в конечном состоянии и пересечь случайные края назад, отслеживание пути. В стандартной конструкции каждый узел в графике достижим от начального состояния, таким образом, Вы не должны волноваться о делании неисправимых ошибок и необходимости отследить в обратном порядке. При достижении начального состояния остановитесь и прочитайте путь продвижение. Это - Ваше соответствие для regex.
нет никакой особой гарантии о том, когда или если Вы достигнете начального состояния, все же. Нужно было бы выяснить, в каком смысле сгенерированные строки 'случайны', и в каком смысле Вы надеетесь на случайный элемент с языка во-первых.
, Возможно, это - начальная точка для размышления о проблеме, хотя!
Теперь, когда я выписал это, мне кажется, что могло бы быть более просто неоднократно разрешить выбор упростить regex шаблон, пока Вас не оставляют с простой строкой. Найдите первый символ неалфавита в шаблоне. Если это *, копируйте предыдущий объект некоторое количество раз и удалите *. Если это |, выберите который из объектов OR'd, чтобы сохранить и удалить остальных. Для левого paren сделайте то же, но рассмотрение символа после права соответствия paren. Это, вероятно, легче при парсинге regex в древовидное представление сначала, которое делает paren группирующейся структурой легче работать с.
человеку, который волновался, что решение, соответствует ли regex на самом деле чему-нибудь, эквивалентно проблеме остановки: Нет, регулярные языки довольно хорошего поведения. Можно сказать, описывают ли какие-либо два regexes тот же набор принятых строк. Вы в основном делаете машину выше, затем следуете алгоритму для создания канонической минимальной эквивалентной машины. Сделайте это для двух regexes, затем проверьте, эквивалентны ли получающиеся минимальные машины, который прост.
Обычно элементы управления адаптируют свои размеры к размеру содержащейся формы. Чтобы настроить размер вашей формы в соответствии с размером вашего DataGridView, вы действительно должны сами определить размер, а затем установить соответствующий размер формы, не забывая учитывать дополнительный размер, требуемый меню формы. полосы и / или панели инструментов, строки состояния или другие элементы управления.
В вашем случае, вероятно, было бы лучше не изменять размер формы в соответствии с элементом управления представлением сетки. Скорее всего, у вас будет намного больше строк в представлении сетки, чем может поместиться на экране Windows, и вы не хотите, чтобы форма выходила за пределы видимой области рабочего стола. Вообще говоря, именно в такой ситуации вам нужно иметь представление сетки с возможностью прокрутки - для просмотра большего количества данных, чем может поместиться на экране за один раз.