Случайная строка, которая соответствует regexp

Все ответы здесь довольно сложны. Я старался сделать это намного проще. Посмотрите на мой код и решите для себя -

int temp  = 0;
int check = 0;

editText.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(editText.getText().toString().length()<temp)
        {
            if(!editText.getText().toString().contains("."))
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()-1) });
            else
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+1) });

        }

        if(!editText.getText().toString().contains("."))
        {
            editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+1) });
            check=0;
        }


        else if(check==0)
        {
            check=1;
            editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+2) });
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        temp = editText.getText().toString().length();


    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }
});
26
задан Ned Batchelder 8 November 2008 в 15:20
поделиться

8 ответов

Используйте принятый ответ в Генерирующие Случайные Пароли , пока он не будет соответствовать Вашему regexp.

0
ответ дан Community 19 July 2019 в 05:36
поделиться

Welp, просто размышление, но общий вопрос генерации случайных исходных данных, которые соответствуют regex звуки, выполнимые мне для достаточно расслабленного определения случайных и достаточно трудного определения regex. Я думаю о классическом формальном определении, которое позволяет только () | * и символы алфавита.

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

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

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

, Возможно, это - начальная точка для размышления о проблеме, хотя!

Теперь, когда я выписал это, мне кажется, что могло бы быть более просто неоднократно разрешить выбор упростить regex шаблон, пока Вас не оставляют с простой строкой. Найдите первый символ неалфавита в шаблоне. Если это *, копируйте предыдущий объект некоторое количество раз и удалите *. Если это |, выберите который из объектов OR'd, чтобы сохранить и удалить остальных. Для левого paren сделайте то же, но рассмотрение символа после права соответствия paren. Это, вероятно, легче при парсинге regex в древовидное представление сначала, которое делает paren группирующейся структурой легче работать с.

человеку, который волновался, что решение, соответствует ли regex на самом деле чему-нибудь, эквивалентно проблеме остановки: Нет, регулярные языки довольно хорошего поведения. Можно сказать, описывают ли какие-либо два regexes тот же набор принятых строк. Вы в основном делаете машину выше, затем следуете алгоритму для создания канонической минимальной эквивалентной машины. Сделайте это для двух regexes, затем проверьте, эквивалентны ли получающиеся минимальные машины, который прост.

19
ответ дан Ken 15 October 2019 в 08:12
поделиться

Строка:: Случайный в Perl генерирует случайную строку от подмножества регулярных выражений:

#!/usr/bin/perl

use strict;
use warnings;

use String::Random qw/random_regex/;

print random_regex('[A-Za-z]{3}[0-9][A-Z]{2}[!@#$%^&*]'), "\n";
17
ответ дан Chas. Owens 15 October 2019 в 08:12
поделиться

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

я подозреваю, что это возможно для создания общего regex случайного генератора соответствия, но это, вероятно, будет очень [еще 111] работа, чем просто обработка конкретного случая - даже если тот случай изменит несколько раз год.

(На самом деле, не может быть возможно генерировать случайные соответствия в самом общем смысле - у меня есть неопределенная память, что проблема "делает любое строковое соответствие, этот regex" является скрытой проблемой остановки. С очень сокращением regex язык у Вас может быть больше удачи все же.)

6
ответ дан Jon Skeet 15 October 2019 в 08:12
поделиться

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

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

1
ответ дан workmad3 15 October 2019 в 08:12
поделиться

Предположение Вас имеет и минимальную длину и 3 4* (или подобный) требование, я просто был бы склонен использовать достойный генератор пароля.

я создал пару в прошлом (и веб-и командная строка) и никогда не должен был пропускать больше чем одну сгенерированную строку для передачи 3 4 правило.

  • 3 4: должен иметь по крайней мере три из следующих характеристик: нижний регистр, верхний регистр, число, символ
0
ответ дан warren 15 October 2019 в 08:12
поделиться

Это возможно (например, у Haskell regexp модуль есть набор тестов, который автоматически генерирует строки, которые должны соответствовать определенному regexes).

Однако для простой задачи под рукой Вы могли бы быть более обеспеченным взятием генератора простого пароля и фильтрацией его вывода с Вашим regexp.

0
ответ дан ADEpt 15 October 2019 в 08:12
поделиться

Почему бы не работать regexp назад? Простой пример: если Ваш regexp

/[a-zA-Z]{6}/

тогда, Вы знаете, что нуждаетесь в 6 буквах a-z или A-Z, поэтому генерируете их. Это может стать более необычным, конечно, и, в зависимости от Ваших потребностей, можно закончить запись реверса весь regexp синтаксический анализатор, но можно прекратить добавлять опции при выполнении потребности.

-1
ответ дан Olie 15 October 2019 в 08:12
поделиться
Другие вопросы по тегам:

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