bayzhanov, "Эрудит" какой-то играете чтоли? ))
Обратились бы на спец ресурс по регуляркам.
Надеюсь число букв в слове конечно и определенно?
Идея есть, для малого количества букв даже в голову регулярка вкладывается, и добавление очередной буквы операция в общем то однотипная , но размер регулярки будет расти в геометрической прогрессии.
Идея такая:
для 1-буквенного слова:
[набор] понятно.
(Для простоты обозначим этот
[набор] как
Q что-бы не загромождать текст)
для 2-буквенного слова: (Q)(?=Q)([^\1]) т.е 1 буква - одна из набора. вторая из 2х частьей:
(?=Q) - positive lookahead - "проверить, не подходит ли текущая позицая к регулярке Q нашему набору, но не захватывать)
([^\1]) - захватить любой символ кроме того который был захвачен ранее.
3 буквы: (Q)(?=Q)([^\1])
(?=Q)([^\1\2]) - суть выделенного фрагмента выше описано.
Ну и далее выделенный и дополненный фрагмент дописываем. Имее в итоге
Code: Select all
1:(Q)
2:(Q)(?=Q)([^\1])
3:(Q)(?=Q)([^\1])(?=Q)([^\1\2])
4:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])
5:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])
6:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])(?=Q)([^\1\2\3\4\5])
7:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])(?=Q)([^\1\2\3\4\5])(?=Q)([^\1\2\3\4\5\6])
8:(Q)(?=Q)([^\1])(?=Q)([^\1\2])(?=Q)([^\1\2\3])(?=Q)([^\1\2\3\4])(?=Q)([^\1\2\3\4\5])(?=Q)([^\1\2\3\4\5\6])(?=Q)([^\1\2\3\4\5\6\7])
Не забываем ^ и $ в начале и конце выражения.
В итоге один такой червяк ищет слово по указанному критерию. Сразу всплывает ограничение: backref-ов в большинстве движков может быть только 9: \1-\9, а значит подобное выражение может поймать максимум 10-буквенное слово.
При этом набор Q=[набор] может быть и длинее чем кол-во букв в слове, но не короче, иначе конец регулярки будет всегда отказывать: (?=[abc]) сработает, но [^abc] откажет.
Обратите внимание, указанная регулярка строгая - находит слова конкретной длинны, слова по короче найдены не будут.
Домашнее задание: модифицировать регулярку так, чтобы находила и слова по-короче. Сдать до пятницы.
