Все ответы здесь довольно сложны. Я старался сделать это намного проще. Посмотрите на мой код и решите для себя -
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
}
});
Используйте принятый ответ в Генерирующие Случайные Пароли , пока он не будет соответствовать Вашему regexp.
Welp, просто размышление, но общий вопрос генерации случайных исходных данных, которые соответствуют regex звуки, выполнимые мне для достаточно расслабленного определения случайных и достаточно трудного определения regex. Я думаю о классическом формальном определении, которое позволяет только () | * и символы алфавита.
Регулярные выражения могут быть отображены на формальных машинах, названных конечные автоматы . Такая машина является ориентированным графом с конкретным узлом, названным конечным состоянием, узел, названный начальным состоянием и буквой от алфавита на каждом краю. Слово принято regex, если возможно запуститься в начальном состоянии и пересечь один край, маркированный каждым символом через график и конец в конечном состоянии.
можно было создать график, затем запуститься в конечном состоянии и пересечь случайные края назад, отслеживание пути. В стандартной конструкции каждый узел в графике достижим от начального состояния, таким образом, Вы не должны волноваться о делании неисправимых ошибок и необходимости отследить в обратном порядке. При достижении начального состояния остановитесь и прочитайте путь продвижение. Это - Ваше соответствие для regex.
нет никакой особой гарантии о том, когда или если Вы достигнете начального состояния, все же. Нужно было бы выяснить, в каком смысле сгенерированные строки 'случайны', и в каком смысле Вы надеетесь на случайный элемент с языка во-первых.
, Возможно, это - начальная точка для размышления о проблеме, хотя!
Теперь, когда я выписал это, мне кажется, что могло бы быть более просто неоднократно разрешить выбор упростить regex шаблон, пока Вас не оставляют с простой строкой. Найдите первый символ неалфавита в шаблоне. Если это *, копируйте предыдущий объект некоторое количество раз и удалите *. Если это |, выберите который из объектов OR'd, чтобы сохранить и удалить остальных. Для левого paren сделайте то же, но рассмотрение символа после права соответствия paren. Это, вероятно, легче при парсинге regex в древовидное представление сначала, которое делает paren группирующейся структурой легче работать с.
человеку, который волновался, что решение, соответствует ли regex на самом деле чему-нибудь, эквивалентно проблеме остановки: Нет, регулярные языки довольно хорошего поведения. Можно сказать, описывают ли какие-либо два regexes тот же набор принятых строк. Вы в основном делаете машину выше, затем следуете алгоритму для создания канонической минимальной эквивалентной машины. Сделайте это для двух regexes, затем проверьте, эквивалентны ли получающиеся минимальные машины, который прост.
Строка:: Случайный в 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";
Если у Вас есть определенная проблема, Вы, вероятно, имеете определенное регулярное выражение в виду. Я взял бы то регулярное выражение, разработал бы то, что это означает в простых человеческих терминах, и работайте оттуда.
я подозреваю, что это возможно для создания общего regex случайного генератора соответствия, но это, вероятно, будет очень [еще 111] работа, чем просто обработка конкретного случая - даже если тот случай изменит несколько раз год.
(На самом деле, не может быть возможно генерировать случайные соответствия в самом общем смысле - у меня есть неопределенная память, что проблема "делает любое строковое соответствие, этот regex" является скрытой проблемой остановки. С очень сокращением regex язык у Вас может быть больше удачи все же.)
Необходимо было бы записать строковый генератор, который может проанализировать регулярные выражения и генерировать случайных членов диапазонов символов для случайных длин, и т.д.
Намного легче должен был бы записать, случайный генератор пароля с определенными правилами (запускается со строчной буквы, имеет по крайней мере одну пунктуацию, прописную букву и число, по крайней мере 6 символов, и т.д.), и затем запишите regex так, чтобы любые пароли, созданные с упомянутыми правилами, были допустимы.
Предположение Вас имеет и минимальную длину и 3 4* (или подобный) требование, я просто был бы склонен использовать достойный генератор пароля.
я создал пару в прошлом (и веб-и командная строка) и никогда не должен был пропускать больше чем одну сгенерированную строку для передачи 3 4 правило.
Это возможно (например, у Haskell regexp модуль есть набор тестов, который автоматически генерирует строки, которые должны соответствовать определенному regexes).
Однако для простой задачи под рукой Вы могли бы быть более обеспеченным взятием генератора простого пароля и фильтрацией его вывода с Вашим regexp.
Почему бы не работать regexp назад? Простой пример: если Ваш regexp
/[a-zA-Z]{6}/
тогда, Вы знаете, что нуждаетесь в 6 буквах a-z или A-Z, поэтому генерируете их. Это может стать более необычным, конечно, и, в зависимости от Ваших потребностей, можно закончить запись реверса весь regexp синтаксический анализатор, но можно прекратить добавлять опции при выполнении потребности.