Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Регулярн. выражения |
Автор: Feldsher 30.12.2012, 03:11 | ||
Всех с наступающим! Ребята, помогите ответом хотя бы в новом году) Не могу написать регулярку для таких строк: есть 3 словаря, символы каждого из которого должны входить в строку хотя бы 1 раз ( [abc], [def], [ghj]) и 2 словаря, символов из которых в строке быть не должно ([^xyz], [^uvw]). Порядок использования словарей в проверяемых строках можеть быть любой. Длина - от 10 до 20 символов. Как написать регулярку, отбирающую соответствующие строки? Заранее спасибо! Пока остановиля на следующем, но результата пока нет
|
Автор: Feldsher 30.12.2012, 18:18 |
Т.е. строка gggggggggggaaaaa проверку проходить не должна (нет ни одного символа из 2-го словаря), aaaaadddddjjjjjj должна проходить проверку (есть буквы из всех 3-х разрешённых словарей, нет запрещённых букв), xaaaaadddddjjjjjj - не должна (есть запрещённый символ). |
Автор: Feldsher 3.1.2013, 18:08 |
С праздником! Да, валидное. |
Автор: LSD 3.1.2013, 18:32 | ||
У меня регулярка получается весьма "кучерявой": первая группа:
и так надо перебрать все варианты перстановок для групп [abc], [def], [ghj]. Мне кажется лучше будет или кодом это сделать или двумя регулярными выражениями. |
Автор: Feldsher 3.1.2013, 19:34 |
Спасибо. А как быть если словари будут по 20 символов? Кодом вроде как не технологично) |
Автор: Arantir 3.1.2013, 19:56 | ||
Feldsher, а пойти от обратного нельзя? Вот эта нехитрая строчка находит все, что вам не подходит. Соответственно все, что не подпадает под это выражение, - то, что вам надо.
http://regexr.com?33a0k Добавлено через 3 минуты и 16 секунд Просто смените условие проверки с true на false и все =) |
Автор: skyboy 3.1.2013, 21:02 |
не заморачивайся на сие. регулярки — для сокращения используются с рассчетом на более понятную запись. все равно они транслируются в конечный автомат. так что если двумя регулярками короче — лучше двумя. если циклом понятнее — лучше циклом. регулярки со своими backtrack'ами порою оказываются http://www.regular-expressions.info/catastrophic.html, приводя чуть ли не к факториальной сложности при выполнении. |
Автор: LSD 4.1.2013, 10:29 | ||
Очень даже технологично, просто надо взять коллекцию которая умеет работать с примитивами http://labs.carrotsearch.com/download/hppc/0.4.2/api/com/carrotsearch/hppc/CharSet.html. И по скорости будет намного быстрее, строку можно будет проверить за один проход и без возвратов. |
Автор: Feldsher 4.1.2013, 14:56 | ||
Arantir - спасибо. А куда писать квантификаторы (проверку длины строки)? Если после группы, то не находится "adh"
skyboy - у нас гл. технолог, если заговорить о замерах производител]ьности, рвёт талоны по ТБ) LSD - а работать с произвольной коллекцией или с сетом (уникальной)? |
Автор: skyboy 4.1.2013, 18:30 |
как я представляю, у тебя как раз подобный случай. пускай вместо (….*…)* у тебя и (.*?….*){10,20} надеюсь, строки фиксированной небольшой длины? |
Автор: skyboy 4.1.2013, 18:57 |
налажал. там экспонентная сложность. |
Автор: Feldsher 7.1.2013, 01:56 |
skyboy - да, от 10 до 20 символов. |