Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Регулярн. выражения


Автор: Feldsher 30.12.2012, 03:11
Всех с наступающим!

Ребята, помогите ответом хотя бы в новом году)
Не могу написать регулярку для таких строк: есть 3 словаря, символы каждого из которого должны входить в строку хотя бы 1 раз ( [abc], [def], [ghj]) и 2 словаря, символов из  которых  в строке быть не должно ([^xyz], [^uvw]). Порядок использования словарей в проверяемых строках можеть быть любой. Длина - от 10 до 20 символов.
Как написать регулярку, отбирающую соответствующие строки?

Заранее спасибо!

Пока остановиля на следующем, но результата пока нет
Код
(  (?=.*[abc])  |   (?=.*[def])   |   (?=.*[ghj])   |   (?!.*[xyz])   |   (?!.*[uvw])  ) {10,20}


Автор: Feldsher 30.12.2012, 18:18
Т.е.  строка      gggggggggggaaaaa проверку  проходить не должна (нет ни одного символа из 2-го словаря),    aaaaadddddjjjjjj должна проходить проверку (есть буквы из всех 3-х разрешённых словарей, нет запрещённых букв), xaaaaadddddjjjjjj - не должна (есть запрещённый символ).

Автор: LSD 3.1.2013, 12:53
Цитата(Feldsher @  30.12.2012,  04:11 Найти цитируемый пост)
Не могу написать регулярку для таких строк: есть 3 словаря, символы каждого из которого должны входить в строку хотя бы 1 раз ( [abc], [def], [ghj]) и 2 словаря, символов из  которых  в строке быть не должно ([^xyz], [^uvw]). Порядок использования словарей в проверяемых строках можеть быть любой.

А в перемешку может быть, слово adgbehcfj валидное?

Автор: Feldsher 3.1.2013, 18:08
С праздником!
Да, валидное.

Автор: LSD 3.1.2013, 18:32
У меня регулярка получается весьма "кучерявой": первая группа:
Код

[^xyzuvw]*[abc]+[^xyzuvw]*[def]+[^xyzuvw]*[ghj]+[^xyzuvw]*

и так надо перебрать все варианты перстановок для групп [abc], [def], [ghj].

Мне кажется лучше будет или кодом это сделать или двумя регулярными выражениями.

Автор: Feldsher 3.1.2013, 19:34
Спасибо.
А как быть если словари будут по 20 символов? Кодом вроде как не технологично)

Автор: Arantir 3.1.2013, 19:56
Feldsher, а пойти от обратного нельзя?
Вот эта нехитрая строчка находит все, что вам не подходит. Соответственно все, что не подпадает под это выражение, - то, что вам надо.
Код

^([^abc]+|[^def]+|[^ghj]+|.*?[xyzuvw]+.*)$

http://regexr.com?33a0k

Добавлено через 3 минуты и 16 секунд
Просто смените условие проверки с true на false и все =)

Автор: skyboy 3.1.2013, 21:02
Цитата(Feldsher @  3.1.2013,  18:34 Найти цитируемый пост)
Кодом вроде как не технологично)

не заморачивайся на сие. регулярки — для сокращения используются с рассчетом на более понятную запись. все равно они транслируются в конечный автомат. так что если двумя регулярками короче — лучше двумя. если циклом понятнее — лучше циклом. 
регулярки со своими backtrack'ами порою оказываются http://www.regular-expressions.info/catastrophic.html, приводя чуть ли не к факториальной сложности при выполнении.

Автор: LSD 4.1.2013, 10:29
Цитата(Feldsher @  3.1.2013,  20:34 Найти цитируемый пост)
А как быть если словари будут по 20 символов? Кодом вроде как не технологично)

Очень даже технологично, просто надо взять коллекцию которая умеет работать с примитивами http://labs.carrotsearch.com/download/hppc/0.4.2/api/com/carrotsearch/hppc/CharSet.html. И по скорости будет намного быстрее, строку можно будет проверить за один проход и без возвратов.

Автор: Feldsher 4.1.2013, 14:56
Arantir - спасибо. А куда писать квантификаторы  (проверку длины строки)? Если после группы, то не находится "adh"  
Код
^  (  [^abc]+  |  [^def]+  |  [^ghj]+  |  .*?  [xyzuvw]+.*){10,20}  $

skyboy - у нас гл. технолог, если заговорить о замерах производител]ьности, рвёт талоны по ТБ)
LSD - а работать с произвольной коллекцией или с сетом (уникальной)?



Автор: skyboy 4.1.2013, 18:30
как я представляю, у тебя как раз подобный случай. пускай вместо (….*…)* у тебя и (.*?….*){10,20}
надеюсь, строки фиксированной небольшой длины?

Автор: skyboy 4.1.2013, 18:57
Цитата(skyboy @  3.1.2013,  20:02 Найти цитируемый пост)
чуть ли не к факториальной сложности

налажал. там экспонентная сложность.

Автор: Feldsher 7.1.2013, 01:56
skyboy - да, от 10 до 20 символов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)